我对C ++中默认参数的引用有疑问。
例如:SWindows(const std::string&, int, const std::string& flag = "UDP");
我不明白为什么这个代码编译(IDE Visual Studio 2012)。 对我来说,引用它是一个对象别名。所以我们不能宣布这条线。假设“旗帜”已经存在。
所以这是编译器优化还是误解?
答案 0 :(得分:3)
const
左值可以绑定到临时对象。就这样。因此,该代码是合法的,并且形式良好。
只要flag
存在,该临时对象的生命周期就会延长。
不需要说,您不能将临时对象绑定到非const左值引用。
答案 1 :(得分:1)
你可以用const引用来做到这一点。您还可以将rvalues与const引用一起使用,如:
void SomeFunction(SomeObject const& s)
{ ... };
然后你可以打电话
SomeFunction(SomeObject());
你可以这样做,因为通过说一个const引用,你告诉你不会修改引用的变量。如果它不是const&
,你将无法做到。
答案 2 :(得分:1)
理解代码
SWindows(const std::string&, int, const std::string& flag = "UDP");
你应该把它分成两部分。
SWindows(const std::string&, int, const std::string& flag );
SWindows( SomeString, SomeInt, "UDP" );
由于“UDP”不是std :: string类型,因此通过调用接受字符串文字作为其第一个参数的构造函数,它隐式地转换为std :: string类型的对象。所以最后一个陈述等同于
SWindows( SomeString, SomeInt, std::string( "UDP" ) );
表达式std :: string(“UDP”)的结果是一个临时对象,可以绑定到const引用。所以const引用是该临时对象的别名,
你可以想象这样一种方式,在函数体内有定义
const std::string &flag = std::string( "UDP" );