奇怪的编译器决定

Sha*_*esh 4 c++ g++

我有以下代码:

enum nums {
  a
};

class cls {
public:
  cls( nums );
};

void function()
{
  cls( a );
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用gcc编译它时,我收到以下错误:

test.cpp: In function ‘void function()’:
test.cpp:12:10: error: no matching function for call to ‘cls::cls()’
test.cpp:12:10: note: candidates are:
test.cpp:7:3: note: cls::cls(nums)
test.cpp:7:3: note:   candidate expects 1 argument, 0 provided
test.cpp:5:7: note: cls::cls(const cls&)
test.cpp:5:7: note:   candidate expects 1 argument, 0 provided
make: *** [test] Error 1
Run Code Online (Sandbox Code Playgroud)

如果我用这个替换函数:

void function()
{
  cls name( a );
}
Run Code Online (Sandbox Code Playgroud)

一切正常.如果我使用带有两个参数的构造函数,它也可以工作.如果我在构造函数中添加"explicit",它就不起作用.

我得到gcc以某种方式将其解析为定义名为"a"的类型为"cls"的变量,但我不熟悉这种定义变量的语法.在我看来,这是一个定义cls类型的匿名临时变量的语句,传递"a"是参数.

用gcc 4.6.3编译.

任何见解?

谢谢,Shachar

Jam*_*nze 10

另一个最令人尴尬的解析问题的例子.这条线:

cls( a );
Run Code Online (Sandbox Code Playgroud)

声明一个名为atype 的局部变量cls,它通过调用默认构造函数来初始化(或者应该).哪个不存在,从而出现错误消息.

如果你真的想要构造一个将在之后立即销毁的临时对象,你可以通过将整个表达式放在括号中来消除歧义:

(cls( a ));
Run Code Online (Sandbox Code Playgroud)

括号中不能出现定义; 表达可以.


Ker*_* SB 8

括号是可选的.所以cls (a);是相同的cls a;,它声明了一个a类型的对象 cls并默认初始化它(因为没有匹配的构造函数而失败).

要创建一个在表达式结尾处到期的临时值,您可以说cls { a };在C++ 11中,或者(cls(a));(或任何更多的奥术结构,如void(0), cls(a);).

有关更多想法,请参阅此答案.

  • @ johnchen902:你有时*有*能够明确地对类型名称部分进行分组,所以这是一个非常有用的功能,比如`(int*)[10]`,而不是`int*[10]`. (2认同)