我遇到的一些类,有一个双字符串构造函数:
construct( const std::string& s );
construct( const char* s );
拥有std::string
构造函数具有明显的好处,即能够在没有std::string
的情况下传递c_str()
。但是,如果参数存储在std :: string中,那么使用const char*
构造函数是否有任何好处?
特别是:
construct( const std::string& s ) : m_string( s ) {}
construct( const char* s ) : m_string( s ) {}
std::string m_string;
对于字符串文字和char*
变量,第二个构造函数会更快,还是会被优化掉?
补充问题 - C ++ 11是否会在此处改变构造?
答案 0 :(得分:8)
在C ++ 03或C ++ 11中,如果没有指定移动语义,const char *
到std::string
隐式转换会创建一个临时字符串,然后将其复制到成员中。这实现了额外的副本。
在C ++ 11中,您可以在传递值后将临时移动:
construct( std::string s ) : member( std::move( s ) ) {}
我唯一能想到的是与提供转换运算符的其他类的兼容性。
struct String {
operator char const * () const;
};
由于只能隐式应用一个用户定义的转化,std::string
函数不会通过String
转换获得char const *
参数。但请注意,如果使用std::string
和两个构造函数的附加转换函数,结果将是过载模糊。
答案 1 :(得分:5)