如果删除了复制赋值运算符,为什么MSVC 12.0会忽略私有构造函数?

时间:2015-11-14 10:42:10

标签: c++ c++11 visual-c++ constructor copy-constructor

请考虑以下代码:

class Test
{
private:
    Test() = default;
    Test operator=(const Test& rhs) = delete;
};

Test t;

int main() { }

MSVC 12和14(分别是Visual Studio 2013和2015)都拒绝编译,正如预期的那样 - 构造函数是私有的,因此我们无法在类本身之外创建该类型的对象。

但是,现在让我们做一个小改动:

 $('body').css('overflow','hidden'); // Setting overflow hidden on body and thus removing the scroll bar

令我惊讶的是,它将在MSVC 12中正常编译(14仍然会出现相同的错误)。为什么会这样?我的第一个想法是,这可能是旧版C ++中的标准行为,但后来我意识到删除构造函数的概念仅在C ++ 11中引入。

这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

嗯,MSVC 12确实有部分c ++ 11支持,但我相信编译是一个bug。我遇到了类似的使用MSVC 12,我可以从非静态模板函数访问私有字段,当我显然不应该。这是一个奇怪编译的编码疏忽。我认为这很奇怪,所以我用GCC编译它,果然GCC说“不好!”。我认为它已经在11月的CTP中修复了,因为我似乎无法复制它。