我对 C++ 中默认参数的引用有疑问。
例子:SWindows(const std::string&, int, const std::string& flag = "UDP");
我不明白为什么这段代码会编译(IDE Visual Studio 2012)。对我来说,引用是对象别名。所以我们不能声明这条线。假设“标志”已经存在。
所以这是编译器优化还是误解?
左值const
可以绑定到临时对象。就这样。因此,该代码是合法且格式正确的。
只要flag
存在,该临时对象的生命周期就会延长。不用说,您不能将临时对象绑定到非常量左值引用。
您可以使用 const 引用来做到这一点。您还可以将右值与 const 引用一起使用,例如:
void SomeFunction(SomeObject const& s)
{ ... };
然后你可以打电话
SomeFunction(SomeObject());
您可以这样做,因为通过说它是一个 const 引用,您就是在告诉您不会修改引用的变量。如果它不是const&
你将无法做到这一点。
了解代码
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" );