我遇到的一些类有一个双字符串构造函数:
construct( const std::string& s );
construct( const char* s );
Run Code Online (Sandbox Code Playgroud)
拥有一个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;
Run Code Online (Sandbox Code Playgroud)
对于字符串文字和char*
变量,第二个构造函数会更快,还是会被优化掉?
附加问题 - C++ 11移动构造在这里改变了什么吗?
在C++ 03,或在C++ 11没有指定移动语义中,const char *
以std::string
隐式转换创建一个临时串,然后把它复制到构件.这实现了额外的副本.
在C++ 11中,您可以在传递值后转移临时值:
construct( std::string s ) : member( std::move( s ) ) {}
Run Code Online (Sandbox Code Playgroud)
我唯一能想到的是与提供转换运算符的其他类的兼容性.
struct String {
operator char const * () const;
};
Run Code Online (Sandbox Code Playgroud)
由于只能隐式应用一个用户定义的转换,因此该std::string
函数不会String
通过转换接收参数char const *
.但是请注意,std::string
对于构造函数和两个构造函数都有额外的转换函数,结果将是过载模糊.
如果您char*
只有第一个构造函数,则可以复制2次.in std::string(char*)
并在construct(std::string)
而在第二个构造函数指针将被复制(它很快),然后复制字符串.
在C++ 11中,好主意是创建1个构造函数
construct(std::string s ) : m_string( std::move(s) ) {}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果你只有char*
数据可能被复制到字符串ctor,但字符串将是临时的,所以它将被移动到construct
ctor
归档时间: |
|
查看次数: |
1237 次 |
最近记录: |