7

我遇到的一些类有一个双字符串构造函数:

 construct( const std::string& s );
 construct( const char* s );

拥有一个std::string构造函数有一个明显的好处是能够传递std::string没有c_str(). const char*但是,如果参数无论如何都存储在 std::string 中,那么使用构造函数有什么好处吗?

尤其是:

 construct( const std::string& s ) : m_string( s ) {}
 construct( const char* s ) : m_string( s ) {}
 std::string m_string;

对于字符串文字和变量,第二个构造函数会更快char*,还是会被优化掉?

附加问题 - C++11 移动构造在这里有什么改变吗?

4

2 回答 2

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和两个构造函数,结果将是重载歧义。

于 2013-07-30T00:48:19.747 回答
5

如果您char*只有第一个构造函数,则可能会复制 2 次。in std::string(char*)并且在construct(std::string)

而在第二个构造函数指针将被复制(它很快)然后复制字符串。

在 C++11 中,好主意是创建 1 个构造函数

 construct(std::string s ) : m_string( std::move(s) ) {}

在这种情况下,如果您只有char*数据可以复制到字符串 ctor 中,但字符串将是临时的,所以它只会在constructctor中移动

此代码打印“创建,复制”
此代码打印“创建,移动”

于 2013-07-30T00:44:10.417 回答