C++ 多个版本的默认特殊成员函数 -- MSVC 2015 中的错误

Posted

技术标签:

【中文标题】C++ 多个版本的默认特殊成员函数 -- MSVC 2015 中的错误【英文标题】:C++ multiple versions of a defaulted special member functions -- error in MSVC 2015 【发布时间】:2016-04-15 21:38:21 【问题描述】:

以下简单代码在newest Visual Studio compiler(MSVC 2015 Update 2)中产生错误:

struct Foo

    template<typename ... Args, typename = std::enable_if_t<sizeof...(Args) != 0> > 
    Foo(Args ...) 
    Foo() = default;  // error

    //Foo()         //this works!
;

错误信息是

错误 C2580: 'Foo::Foo(void)': 不允许使用多个版本的默认特殊成员函数

gcc 毫无问题地接受它。

在我看来,这似乎是一个明显的错误(从某种意义上说,它不受标准支持)。还有其他意见吗?

【问题讨论】:

只有一点点相关:我对 VS2015 的 UPD2 非常不满意,这几乎是可笑的,如果不是因为那堆热气腾腾的一堆东西破坏了@work。相关:clang 吃掉这个也没问题。 我猜这是因为缺少两阶段查找?哦,我在开玩笑,我不知道。前段时间我停止了关注真正的热气腾腾的堆(即C++)的发展。 对我来说看起来像一个错误。如果您对解决方法感兴趣,可以将其设为 template &lt;typename Arg, typename... Args&gt; Foo(Arg, Args...); 这可能是确保模板化构造函数至少采用一个参数的更直接的方法。 【参考方案1】:

这是 VS 2015 Update 2 中的一个错误。我们已经修复了这个错误(202164,虽然这是一个内部错误编号。)此代码应该在 Update 3 版本中工作。

【讨论】:

如果您有兴趣自己验证,我们(MS C++ 编译器团队)将内部编译器建立在 webcompiler.cloudapp.net 上,以便人们可以在浏览器中测试类似的东西。 你能提供更多关于这个错误的信息吗?实际上,的错误是什么?这样,遇到类似但略有不同问题的该页面的访问者将知道您的错误修复是否也为他们解决了问题。

以上是关于C++ 多个版本的默认特殊成员函数 -- MSVC 2015 中的错误的主要内容,如果未能解决你的问题,请参考以下文章

C++类的特殊成员-默认/拷贝/移动构造函数

msvc visual c++从静态成员函数中不正确地形成绑定成员函数表达式

对比 C# 聊聊 C++ 中几类特殊成员函数

C++从入门到入土第四篇:类与对象(中篇)

详解c++中类的六个默认的成员函数

详解c++中类的六个默认的成员函数