守则:
struct T { T() {} };
struct S
{
T t;
S() noexcept = default;
};
int main()
{
// S s;
}g++ 4.9.2接受此操作时没有错误或警告,但是第7行的clang3.6和3.7报告:
error: exception specification of explicitly defaulted default constructor does not match the calculated one但是,如果没有注释掉行S s;,g++ 4.9.2现在报告:
noex.cc: In function 'int main()':
noex.cc:12:7: error: use of deleted function 'S::S()'
S s;
^
noex.cc:7:5: note: 'S::S() noexcept' is implicitly deleted because its exception-specification does not match the implicit exception-specification ''
S() noexcept = default;
^哪个编译器适合原始代码?
背景:
g++甚至允许将以下内容添加到main中
std::cout << std::is_constructible<S>::value << '\n';输出0。我在使用clang编译一些复杂的代码时遇到了这个问题,这些代码大量使用了模板、SFINAE和to。在该代码中,S和T是模板类;因此,行为取决于使用哪种类型S进行实例化。在某些类型中,Clang拒绝这个错误,而g++允许它,而SFINAE基于is_constructible和类似的特性工作。
发布于 2015-04-07 03:32:54
取决于您正在咨询的标准的版本。
默认/p2: N3337 dcl.fct.def.default/p2:
一个显式的默认函数.只有在与隐式声明上的异常规范兼容(15.4)时,才可能有显式的异常规范。
它显示原始代码格式不正确。
CWG issue 1778将其更改为read (N4296 dcl.fct.def.default/p3):
如果显式默认的函数使用与隐式声明中的异常规范不兼容(15.4)的异常规范声明,那么
这意味着构造函数现在仅仅被定义为已删除。(上面的措辞包含了N4285所做的修改,这是一篇后C++14的论文,目的是进行一些纯粹的编辑上的修改。N3936版本实质上是相同的。)
GCC大概是执行Clang 1778的决议,而Clang则没有。
https://stackoverflow.com/questions/29483120
复制相似问题