gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:15:50 25 4
gpt4 key购买 nike

考虑以下代码:

class Test
{
private:
Test() = default;
};

Test t;

int main() { }

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

不过,现在让我们做一个小改动:

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

Test t;

int main() { }

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

这是一个错误吗?

最佳答案

嗯,MSVC 12 确实有部分 C++ 11 支持,但我确实认为编译是一个错误。我在使用 MSVC 12 时遇到了类似的情况,我可以从非静态模板函数访问私有(private)字段,而我显然不应该这样做。这是一个奇怪的编码疏忽。我觉得这很奇怪,所以我用 GCC 编译了它,果然 GCC 说“不好!”。我认为它已在 11 月的 CTP 中修复,因为我似乎无法复制它。

关于c++ - 如果删除了复制赋值运算符,为什么 MSVC 12.0 会忽略私有(private)构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33707515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com