字符串字面量重载

5

在初始化列表中,是否有可能创建仅接受空字符串的构造函数重载?

struct null_ptr_type;

struct str
{
  str(null_ptr_type*) {}
  str(const char(&)[1]) {}
};

struct config
{
  str s;
};

int main()
{
  config c1 = {0}; // Works, implicit conversion to a null pointer
  config c2 = {str("")}; // Works
  config cx = {str("abc")}; // Fails (as desired)
  config c3 = {""}; // Fails with no conversion possible
}

有没有办法让 c3 的语法在不接受非空字符串的情况下正常工作?我不明白为什么不行,因为 c1 是可以的。是否有些规则我忽略了,导致这种情况被禁止了呢?

1
clang++3.5也接受这种转换。 - dyp
你能不能不给它一个默认值,这样你就可以做config(string fred = "");了? - user628985
1
为什么你想要这个?我无法想象任何理由。 - Cheers and hth. - Alf
@Cheersandhth.-Alf,国际化。该字符串将显示给用户,我想强制所有非空字符串都包含在N_()中,但很多字符串是空字符串,我不想修改每一个。 - Dark Falcon
在进一步思考后,这并不能解决你的"避免修复现有的空字符串"的问题。虽然我不确定我完全理解问题。但是,在代码中出现这么多空字符串参数确实有些奇怪。 - Cheers and hth. - Alf
显示剩余4条评论
1个回答

0

使用C++11和“统一初始化语法”,您可以使其工作,前提是您能够修改struct config的接口:

struct config
{
  str s;

  config(str s) : s(s) {}
};

int main()
{
  config c1 = {0}; // Works, implicit conversion to a null pointer
  config c2 = {str("")}; // Works
  config cx = {str("abc")}; // Fails (as desired)
  config c3 = {""}; // Works
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接