c – 使用隐式转换运算符返回const引用的类上的static_cast <
发布时间:2020-12-16 03:23:01 所属栏目:百科 来源:网络整理
导读:我有以下类(剥离以仅包含相关部分): #include stringclass Text{private: std::string _text;public: Text(std::string text) : _text(std::move(text)) { } operator const std::string() const { return _text; }}; 我的问题是:如果我想获得一个const st
我有以下类(剥离以仅包含相关部分):
#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. }
测试2 int main() { Text text(Noisy{}); auto& s = static_cast<const Noisy&>(text); }
注意:使用选项-fno-elide-constructors编译以避免复制省略优化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |