【发布时间】: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