【发布时间】:2013-08-21 05:35:04
【问题描述】:
代码如下:
struct Foo {
Foo(const char *);
};
Foo::Foo(const char *str = 0)
{
}
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
但运气不好,他们会暂停错误修复,直到草案成为标准。
【问题讨论】:
-
CLANG 更有意义。您应该将默认参数放在构造函数的声明中,而不是在其定义中。
-
如果不查看规范,我认为 clang 是正确的。想想如果在同一个文件中没有结构定义和构造函数定义会发生什么(例如,正常拆分为头文件和源文件),那么只有具有构造函数定义的源文件才会知道默认参数和该结构没有其他用户。
标签: c++ visual-c++ gcc c++11 clang++