如果我们有一个带有非显式构造函数的不可移动的非可复制类,我们可以返回它并使用如下(在C ++ 11中):
#include <iostream>
class NonCop
{
public:
/*non explicit*/ NonCop(int a, int b) : number(a + b) {}
NonCop(const NonCop&) = delete;
int number;
};
NonCop get_non_cop()
{
return {1, 2};
}
int main()
{
NonCop &&nc = get_non_cop();
std::cout << "three: " << nc.number << std::endl;
return 0;
}
但是,如果构造函数是显式的,则它不起作用。有没有在C ++ 11 / C ++ 14中执行此操作的方法,而NonCop
没有修改?
目前我正在使用从NonCop派生的解决方法,使用“deexplicits”构造函数的包装器,但它看起来不太漂亮。
答案 0 :(得分:2)
不幸的是,在此上下文中,您无法返回临时对象,因为在返回值表达式时,编译器要求可以访问对象的复制构造函数,即使此对象将要复制最终被淘汰了。但是,您可以返回std::unique_ptr
而不是具体对象。
std::unique_ptr<NonCop> get_non_cop() {
return std::make_unique<NonCop>(1, 2);
}