Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用“自动”时初始化结构会导致VS 2013中出现副本_C++_Visual Studio_C++11_Visual Studio 2013 - Fatal编程技术网

C++ 使用“自动”时初始化结构会导致VS 2013中出现副本

C++ 使用“自动”时初始化结构会导致VS 2013中出现副本,c++,visual-studio,c++11,visual-studio-2013,C++,Visual Studio,C++11,Visual Studio 2013,在以下代码中,创建嵌套对象的行仅打印构造函数,而不打印VS 2013: 所以我猜这里发生的是一个临时对象被复制到n中。没有编译器生成的move构造函数,所以它不是move 我想知道这是错误还是可以接受的行为?为什么在这里添加默认构造函数会阻止复制?这是MSVC在执行与brace init构造函数相关的复制省略时的失败。这两种方式都是完全合法的。问题不在于自动;以下内容将展示相同的内容: nested n = nested{}; 使用{}直接初始化临时对象,然后使用该临时对象对n进行复制初始化

在以下代码中,创建嵌套对象的行仅打印构造函数,而不打印VS 2013:

所以我猜这里发生的是一个临时对象被复制到n中。没有编译器生成的move构造函数,所以它不是move


我想知道这是错误还是可以接受的行为?为什么在这里添加默认构造函数会阻止复制?

这是MSVC在执行与brace init构造函数相关的复制省略时的失败。这两种方式都是完全合法的。

问题不在于自动;以下内容将展示相同的内容:

nested n = nested{};
使用{}直接初始化临时对象,然后使用该临时对象对n进行复制初始化,因为在本例中,test是类类型,具有用户定义的构造函数

允许实现直接初始化最终目标n,但没有义务这样做,因此两者都是合法的


标准的8.5和8.5.1中有很多细节

我的叮当声也打印出析构函数,我觉得奇怪,你的不符合你开头的句子。@WhozCraig我把它写错了。当然它也会打印析构函数,但这是意料之中的。我指的是auto n=nested{}line生成的输出。这样看来,gcc正在删除副本,而MS不是,也不必这样做。这听起来很愚蠢,但使用嵌套的n=nested{};,情况是否也是这样?如果不一样的话,我会正式将sucks bar提升到一个全新的水平。@WhozCraig它是一样的,所以这不是auto的错。虽然用“帮助”替换{}。但对MSVC用户来说,这是非常悲哀的。@SebastianRedl为他们辩护说,VS2013还不是RTM,它与一个新功能有关,如果不是自动搞乱的话,当然……是真的。提交错误报告的理由就更多了。@rubenvb事实上,它不是自动的。将{}替换为防止复制。是啊,我的超自然能力!那些选票在哪里-Pbecause test在本例中是一个类类型,具有用户定义的构造函数hmm,但嵌套的没有任何?。事实上-但它的聚合初始化列表比它的成员列表短,因此该成员使用等价的test{}直接初始化。
constructor
copy constructor
destructor

destructor
nested n = nested{};