void doStuff( std::string const & s1, std::string const & s2="");
我想知道这个代码在C ++中是否合法,对于s2字符串。 我希望有一个默认参数,但是传递一个引用并且默认为空字符串。是否会临时创建,引用会指向那个临时的,还是非法的C ++?
答案 0 :(得分:11)
是的,这是合法的。 const
将确保暂时持续到doStuff
函数完成。
§12.2.5
在函数调用(5.2.2)中对引用参数的临时绑定一直持续到包含该调用的完整表达式完成为止。
答案 1 :(得分:1)
更好的将是
void doStuff( std::string const & s1, std::string const & s2 = std::string());
避免额外的临时const char *
。 (您的变体有2个临时值:const char *
和空std::string
)。
或者,使用用户定义的文字(C ++ 14):
void doStuff( std::string const & s1, std::string const & s2 = ""s);
答案 2 :(得分:0)
要理解语义,最好将原始状态分开。
void doStuff( std::string const & s1, std::string const & s2="");
分为两个陈述
void doStuff( std::string const & s1, std::string const & s2);
doStuff( SomeString, "" );
在函数调用中,第二个参数被隐式转换为std :: string类型的对象:
s2 = std::string( "" );
事实上,在你将拥有的功能体中
std :: string const& s2 = std :: string(“”);
这是常量引用s2将引用临时对象std :: string(“”)。