首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc接受、clang拒绝的带有“by以外”构造函数的程序

gcc接受、clang拒绝的带有“by以外”构造函数的程序
EN

Stack Overflow用户
提问于 2015-04-07 03:15:59
回答 1查看 7.3K关注 0票数 21

守则:

代码语言:javascript
复制
struct T { T() {} };

struct S
{
    T t;

    S() noexcept = default;
};

int main()
{
//    S s;
}

g++ 4.9.2接受此操作时没有错误或警告,但是第7行的clang3.6和3.7报告:

代码语言:javascript
复制
error: exception specification of explicitly defaulted default constructor does not match the calculated one

但是,如果没有注释掉行S s;,g++ 4.9.2现在报告:

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

代码语言:javascript
复制
std::cout << std::is_constructible<S>::value << '\n';

输出0。我在使用clang编译一些复杂的代码时遇到了这个问题,这些代码大量使用了模板、SFINAE和to。在该代码中,ST是模板类;因此,行为取决于使用哪种类型S进行实例化。在某些类型中,Clang拒绝这个错误,而g++允许它,而SFINAE基于is_constructible和类似的特性工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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则没有。

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

https://stackoverflow.com/questions/29483120

复制
相关文章

相似问题

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