相关疑难解决方法(0)

复制/移动省略是否允许使用格式正确的删除函数制作程序?

请考虑以下代码:

#include <iostream>

struct Thing
{
    Thing(void)                       {std::cout << __PRETTY_FUNCTION__ << std::endl;}
    Thing(Thing const &)              = delete;
    Thing(Thing &&)                   = delete;
    Thing & operator =(Thing const &) = delete;
    Thing & operator =(Thing &&)      = delete;
};

int main()
{
    Thing thing{Thing{}};
}
Run Code Online (Sandbox Code Playgroud)

我希望Thing thing{Thing{}};声明意味着临时对象的建设Thing使用默认的构造函数和建设类thing的对象Thing使用仅仅用创建的临时对象作为参数转移构造类.我希望这个程序被认为是不正确的,因为它包含一个被删除的移动构造函数的调用,即使它可能被省略.标准的class.copy.elision部分似乎也要求这样做:

即使呼叫被省略,也必须可以访问所选的构造函数

通过简化值类别保证复制省略措辞似乎也不允许.

然而gcc 7.2(以及clang 4也是如此,但VS2017 仍然不支持保证复制省略)将编译此代码,只需移动构造函数调用即可.

在这种情况下哪种行为是正确的?

c++ constructor copy-elision c++17

4
推荐指数
1
解决办法
229
查看次数

标签 统计

c++ ×1

c++17 ×1

constructor ×1

copy-elision ×1