我有以下类(剥离以仅包含相关部分):
#include <string> class Text { private: std::string _text; public: Text(std::string&& text) : _text(std::move(text)) { } operator const std::string&() const { return _text; } };
我的问题是:如果我想获得一个const std :: string& ;,我可以这样做而不会受到任何惩罚:
Text text("fred"); auto& s = static_cast<std::string>(text);
或者这会构造一个中间的std :: string,我最终会得到一个引用?这种情况是否有标准方法?我是C的新手.
解决方法
不,当您调用static_cast< std :: string>(text)时,您将调用隐式定义的复制构造函数并创建临时对象.
但是,如果你打电话的话
auto& s = static_cast<const std::string&>(text);
,那么你将正确地调用显式转换运算符操作符const Noisy&().
我们来试试吧
struct Noisy { Noisy() { std::cout << "Default construct" << std::endl; } Noisy(const Noisy&) { std::cout << "Copy construct" << std::endl; } Noisy(Noisy&&) { std::cout << "Move construct" << std::endl; } Noisy& operator=(const Noisy&) { std::cout << "C-assign" << std::endl; return *this; } Noisy& operator=(Noisy&&) { std::cout << "M-assign" << std::endl; return *this; } ~Noisy() { std::cout << "Destructor" << std::endl; } }; class Text { public: Text(Noisy&& text) : _text(std::move(text)) {} operator const Noisy&() const { return _text; } private: Noisy _text; };
测试1
int main() { Text text(Noisy{}); const auto& s = static_cast<Noisy>(text); // Needs 'const' to bind to temporary. }
Default construct
Move construct
Destructor
Copy construct
Destructor
Destructor
测试2
int main() { Text text(Noisy{}); auto& s = static_cast<const Noisy&>(text); }
Default construct
Move construct
Destructor
Destructor
注意:使用选项-fno-elide-constructors编译以避免复制省略优化.