"Hello."
是一个临时构造,被复制到std::string
并随后被销毁。我们可以跳过复制并直接移动。但任何体面的编译器都会忽略副本。所以有以下几点:
std::string s(std::move("Hello."));
答案 0 :(得分:3)
不,移动字符串文字是没有意义的。它是一个静态数组(不是一个“构造的临时”),它不能移动,只能被复制。
答案 1 :(得分:0)
如果这甚至是合法的,我不知道是不是,那就不是优化任何东西了。
文字在编译时在静态空间中创建。它无法移动。 string
将始终拥有数据的副本,而不仅仅是“引用”它。
答案 2 :(得分:0)
您的代码没有多大意义,因为它在逻辑上与此相同:
Foo bar( std::move( 123 ) );
没有必要移动常量,字符串文字是常量。更好的问题是,我认为你的问题真正意味着什么:
class Foo { ... };
class Bar {
public:
Bar( const Foo &foo );
Bar( Foo &&foo );
...
};
Bar bar( std::move( Foo() ); // Does it make sense?
所以实际上对于这种情况std::move
可以用作语法糖来避免表单的函数声明:
Bar bar( Foo() );
但它不会进行任何优化,在这种情况下:
Bar bar = std::move( Foo() );
这将是完全多余的