void doStuff( std::string const & s1, std::string const & s2="");
我想知道对于 s2 字符串,这段代码在 C++ 中是否合法。我想要一个默认参数,但传递一个引用并有一个空字符串作为默认值。是否会创建一个临时文件,并且引用将指向该临时文件,还是非法 C++?
void doStuff( std::string const & s1, std::string const & s2="");
我想知道对于 s2 字符串,这段代码在 C++ 中是否合法。我想要一个默认参数,但传递一个引用并有一个空字符串作为默认值。是否会创建一个临时文件,并且引用将指向该临时文件,还是非法 C++?
是的,这是合法的。const
将确保暂时持续到功能doStuff
完成。
§ 12.2.5
临时绑定到函数调用 (5.2.2) 中的引用参数将持续存在,直到包含调用的完整表达式完成。
会更好
void doStuff( std::string const & s1, std::string const & s2 = std::string());
避免额外的临时性const char *
。(您的变体有 2 个临时变量: aconst char *
和 empty std::string
)。
或者,使用用户定义的文字 (C++14):
void doStuff( std::string const & s1, std::string const & s2 = ""s);
为了理解语义,最好拆分原始 statemenet 。
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( "" )。