C ++理解默认参数中的引用

时间:2013-11-05 21:47:51

标签: c++ reference

我对C ++中默认参数的引用有疑问。

例如:SWindows(const std::string&, int, const std::string& flag = "UDP");

我不明白为什么这个代码编译(IDE Visual Studio 2012)。 对我来说,引用它是一个对象别名。所以我们不能宣布这条线。假设“旗帜”已经存在。

所以这是编译器优化还是误解?

3 个答案:

答案 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" );
相关问题