【问题标题】:Why does MSVC 12.0 ignore private constructors if the copy assignment operator is deleted?如果复制赋值运算符被删除,为什么 MSVC 12.0 会忽略私有构造函数?
【发布时间】:2016-02-15 21:45:34
【问题描述】:

考虑以下代码:

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

Test t;

int main() { }

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

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

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

Test t;

int main() { }

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

这是一个错误吗?

【问题讨论】:

  • VS2012 对于完全符合 C++11 的期望还为时过早。他们花了一段时间,他们必须完全重写他们的前端才能到达那里。代码库的技术债务是针对具有 256 KB 内存的机器而编写的。 VS2015 的工作已经完成。
  • 触及Test是否是一个聚合的问题。棘手的问题。
  • @HansPassant:关于“VS2015 的工作已经完成”,我想我最近阅读了开发团队的一篇博客文章,他们仍在努力,并且做得很好。你有更多关于“完成”的信息吗?

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    相关资源
    最近更新 更多