我得到了以下代码:
enum nums {
a
};
class cls {
public:
cls( nums );
};
void function()
{
cls( a );
}当我尝试用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如果我用下面的代码替换函数:
void function()
{
cls name( a );
}然后一切都能正常工作。如果我使用一个带有两个参数的构造函数,它也可以工作。如果我在构造函数中添加"explicit“,它就不起作用了。
我知道gcc不知何故将其解析为定义一个名称为"a“的"cls”类型的变量,但我不熟悉这种定义变量的语法。在我看来,这是一个定义cls类型的匿名临时变量的语句,传递的"a“是参数。
编译: gcc 4.6.3。
有什么见解吗?
谢谢,沙查
发布于 2013-07-11 21:04:51
括号是可选的。因此,cls (a);与cls a;相同,后者声明了一个cls类型的对象a并对其进行默认初始化(这会失败,因为没有匹配的构造函数)。
要只创建一个在表达式末尾过期的临时值,可以在C++11或(cls(a)); (或任何数量的更神秘的构造,如void(0), cls(a);)中使用cls { a };。
有关更多想法,请参阅this answer。
发布于 2013-07-11 21:06:00
最令人尴尬的解析问题的另一个例子。这行代码:
cls( a );声明cls类型的名为a的局部变量,该变量是(或应该)通过调用默认构造函数初始化的。它并不存在,错误信息就是从这里发出的。
如果你真的想构建一个临时对象,然后立即销毁,你可以通过将整个表达式放在括号中来消除歧义:
(cls( a ));定义不能出现在括号中;表达式可以。
https://stackoverflow.com/questions/17594052
复制相似问题