强制移动而不是复制返回的常量值
Force a returned const value to move not copy
我知道这是可以的:
struct Foo {
Foo& operator=( Foo& ) = delete; // disallow assign
Foo( int ) { } // some basic constructor
Foo( const Foo& ) = delete; // disallow copy
Foo( Foo&& ) { } // allow move
};
Foo getFoo( void ) {
return Foo( 3 );
}
Foo foo = getFoo( ); // uses move constructor
而这将使用复制构造函数,因此对Foo
无效(对于任何带有复制构造函数的对象,它都是有效但低效的):
const Foo getConstFoo( void ) {
return Foo( 3 );
}
const Foo constFoo = getConstFoo( ); // error: copy constructor is deleted!
但这是可以的:(并将延长constFooRef
的寿命)
const Foo& constFooRef = getConstFoo( ); // uses move constructor
现在,第二种情况将调用
Foo( const Foo&& ) { }
如果可用的话。所以我想知道是否有任何方法可以从构造函数内部检测到最终对象将是const
。如果有,我可以应用移动语义(因为涉及的两个对象都是const,并且参数没有在其他地方使用,所以可以去掉const),并使第二种情况合法。
因此,虽然我的问题标题解释了我试图实现的最终结果,但我的子问题是检测对象在构建后是否会变常量(我天真地尝试了Foo( const Foo&& ) const { }
,但没有成功!)
您可以执行
Foo::Constant getConstFoo( void ) {
return Foo::Constant( 3 );
}
其中Foo::Constant是不可变的
struct Foo {
struct Constant
{
Constant(Foo&&);
};
Foo& operator=( Foo& ) = delete; // disallow assign
Foo( int ) { } // some basic constructor
Foo( const Foo& ) = delete; // disallow copy
// You might not use: Foo( Foo&& ) { } // allow move
};
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 如何在C++中的单行中返回常量数组中的值
- 为什么 c_str() 在返回常量指针值时不输出地址
- 矢量返回常量引用,不可能向下转换
- 使用常量函数返回常量引用时出现奇怪的行为
- 返回常量和核心转储的函数
- 文字符号和字符串变量之间的串联然后返回常量字符*
- 函数重载通过返回常量和不返回常量
- 在C++中返回常量引用
- 从函数返回常量字符指针
- C++重载运算符两次,一个返回非常量引用,另一个返回常量引用,首选项是什么
- 返回常量的工厂函数
- C++-使用模板公开返回常量引用,私下返回非常量引用
- 返回常量模板类型的模板函数
- 如何避免内存泄漏与返回常量字符*
- 正在返回常量引用