fgh*_*ghj 19 c++ gcc visual-c++ c++11 clang++
代码如下:
struct Foo {
Foo(const char *);
};
Foo::Foo(const char *str = 0)
{
}
Run Code Online (Sandbox Code Playgroud)
VS 2013和gcc 4.8.0接受这样的代码,而clang 3.3拒绝这样的代码:
错误:在重新声明时添加默认参数会使此构造函数成为默认构造函数
谁从标准(C++ 03和C++ 11)的观点来看是正确的?
注意:
我也喜欢clang的选择,但我会向gcc和visual studio报告bug,如果从标准的角度来看这不正确,这有助于说服编译器的开发人员解决这个问题.
GCC
我在这里描述了一个问题:http://gcc.gnu.org/bugzilla/show_bug.cgi?id = 58194
但没有运气,他们暂停bug修复,直到草案成为标准.
Tem*_*Rex 12
这已在Clang邮件列表中进行了讨论,并已作为缺陷报告核心问题1344 提交.
从邮件列表讨论:
这个想法是某些特殊成员的存在会影响类类型的核心属性,例如它是POD还是可以复制.决定这些属性不应该需要整个程序知识; 能够从类定义中推断出它们对我们来说很重要.真正有问题的情况是通过添加默认参数将"普通"构造函数转换为复制或移动构造函数,但IIRC引入默认构造函数也存在问题.
修复是您应该将默认参数放在构造函数的初始声明中.
这是WG21在布卢明顿会议上讨论的最后一次.来自那里的笔记:
"共识:按照撰写文件中的建议,使其形成不良.核心问题1344.优先级0,道格起草."
因此,CWG(原则上)同意这应该是不正确的.
TL; DR Clang在缺陷得到修复时是正确的(不确定是否只能在C++ 14中正式发生,或者如果委员会的决定也可以在C++ 11上追溯完成)
| 归档时间: |
|
| 查看次数: |
5763 次 |
| 最近记录: |