滥用逗号运算符

mik*_*ked 9 c++ overloading comma-operator

我正在寻找一种在编译时构建字符串数组的简单方法.对于测试,我将一个名为Strings具有以下成员的类放在一起:

Strings(); 
Strings(const Strings& that);
Strings(const char* s1);
Strings& operator=(const char* s1);
Strings& operator,(const char* s2);
Run Code Online (Sandbox Code Playgroud)

使用这个,我可以成功编译这样的代码:

Strings s;
s="Hello","World!";
Run Code Online (Sandbox Code Playgroud)

s="Hello"部分调用operator=返回a Strings&然后调用的operator,get "World!".

我无法工作(在MSVC中,尚未尝试任何其他编译器)是

Strings s="Hello","World!";
Run Code Online (Sandbox Code Playgroud)

我假设这里Strings s="Hello"会调用复制构造函数,然后一切都会像第一个例子一样.但我得到错误:error C2059: syntax error : 'string'

但是,这很好用:

Strings s="Hello"; 
Run Code Online (Sandbox Code Playgroud)

所以我知道复制构造函数至少可以用于一个字符串.有任何想法吗?我真的很想让第二种方法工作,只是为了使代码更清洁.

Uri*_*Uri 14

我认为你的第二个例子中的逗号不是逗号运算符,而是多个变量声明的语法元素.

例如,你可以写的方式相同:

int a=3, b=4
Run Code Online (Sandbox Code Playgroud)

在我看来,你基本上是在写:

Strings s="Hello", stringliteral
Run Code Online (Sandbox Code Playgroud)

因此编译器期望逗号后面的项是变量的名称,而是看到一个字符串文字并宣布错误.换句话说,构造函数应用于"Hello",但之后的逗号不是字符串的逗号运算符.

顺便说一句,构造函数实际上不是一个复制构造函数.它从文字字符串参数创建一个字符串对象......术语复制构造函数通常应用于相同的类型.

  • 有可能变得乏味迂腐,`Strings s ="Hello";`相当于`Strings s = Strings("Hello");`.它要求copy ctor可以调用,甚至可以调用它来从临时对象构造`s`.但是使用`s`的`const char*`构造函数直接初始化来替换它的优化是允许的并且是常见的. (2认同)

Igo*_*sky 8

我不推荐这种API.您将继续发现无法按预期工作的情况,因为逗号是具有最低优先级的运算符.例如,这种情况也不起作用:

if ("Hello","world" == otherStrings) { ... }
Run Code Online (Sandbox Code Playgroud)

如果每次在字符串集周围使用括号,您可能能够正常工作,如下所示:

Strings s=("Hello","World!");
Run Code Online (Sandbox Code Playgroud)

我上面的例子看起来像这样:

if (("Hello","world") == otherStrings) { ... }
Run Code Online (Sandbox Code Playgroud)

这可能会起作用,但简写语法可能不值得随之而来的棘手语义.

  • 可以这样做吗?我预见到的问题是,你不能超载运营```用于为const char*`,所以`("你好","世界")`只是一样`"世界"`. (3认同)