这个小测试程序:
#include <functional>
//template<class T> // <-- with this, gcc compiles ok
template<class T=void>
struct c{
std::function<int(int)> f = [](int i){return i+i;};
};
int main() {};
Clang-3.2 可以正常编译,但是从 GCC 4.7.1 和 4.8 开始,我收到了奇怪的错误:
t.cc:6:31: error: default argument for template parameter for class enclosing ‘struct __lambda0’
function<int(int)> f = [](int i){return i+i;};
^
这是那些没人知道的晦涩的 C++ 规则异常之一还是 GCC 错误?
EDIT看起来像一个错误。我已备案错误报告 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54764
我认为这是默认成员初始化的 g++ bug。我对此并不肯定,因此有以下证据支持:
template<class T=void>
struct c {
std::function<int(int)> f;
c() : f([](int i){return i+i;}) {
}
};
int main() {}
如果这有效,那么你正在做的事情也应该有效。即使你构建了一个c
.
就我个人而言,我认为应该谨慎使用默认成员初始化。我认为这很容易造成很多混乱,因为大多数人希望所有初始化都在构造函数中完成,并且成员初始值设定项不一定位于任何构造函数附近。因此,他们可能会让人摸不着头脑,想知道某些成员如何获得特定的价值。
我可以看到一些案例,特别是对于简单的、主要是数据的类,它可以很好地工作。但大多数情况下,我认为如果您有任何类型的构造函数主体,您可能不应该使用默认成员初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)