强制移动而不是复制返回的常量值

Force a returned const value to move not copy

本文关键字:返回 常量 复制 移动      更新时间:2023-10-16

我知道这是可以的:

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
};