首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的编译器决定

奇怪的编译器决定
EN

Stack Overflow用户
提问于 2013-07-11 20:58:43
回答 2查看 193关注 0票数 4

我得到了以下代码:

代码语言:javascript
复制
enum nums {
  a
};

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

void function()
{
  cls( a );
}

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

代码语言:javascript
复制
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

如果我用下面的代码替换函数:

代码语言:javascript
复制
void function()
{
  cls name( a );
}

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

我知道gcc不知何故将其解析为定义一个名称为"a“的"cls”类型的变量,但我不熟悉这种定义变量的语法。在我看来,这是一个定义cls类型的匿名临时变量的语句,传递的"a“是参数。

编译: gcc 4.6.3。

有什么见解吗?

谢谢,沙查

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-11 21:04:51

括号是可选的。因此,cls (a);cls a;相同,后者声明了一个cls类型的对象a并对其进行默认初始化(这会失败,因为没有匹配的构造函数)。

要只创建一个在表达式末尾过期的临时值,可以在C++11或(cls(a)); (或任何数量的更神秘的构造,如void(0), cls(a);)中使用cls { a };

有关更多想法,请参阅this answer

票数 8
EN

Stack Overflow用户

发布于 2013-07-11 21:06:00

最令人尴尬的解析问题的另一个例子。这行代码:

代码语言:javascript
复制
cls( a );

声明cls类型的名为a的局部变量,该变量是(或应该)通过调用默认构造函数初始化的。它并不存在,错误信息就是从这里发出的。

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

代码语言:javascript
复制
(cls( a ));

定义不能出现在括号中;表达式可以。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17594052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档