const引用默认值

aia*_*iao 16 c++ const reference default-value

可能重复:
如何初始化具有默认值的类的函数参数

#include <string>

void foo1(const std::string& s = std::string());

void foo2(std::string& s = std::string());

void foo3(const std::string s = std::string());

void foo4(std::string s = std::string());
Run Code Online (Sandbox Code Playgroud)

error at foo2(): default argument for ‘std::string& s’ has type ‘std::string {aka std::basic_string<char>}’

我理解编译器的观点,但我不知道这也不适用于foo1()它.

Bil*_*ill 24

你不能对foo2这样的临时引用非const引用.

请注意,这不是特定的默认参数.函数变量会出现相同的错误:http://ideone.com/g7Tf7L

#include <string>
using std::string;

#include <iostream>
using std::cout; using std::endl;

int main()
{
    string s1        = string("s1"); // OK, copy it
    const string& s2 = string("s2"); // OK, const reference to it
    string& s3       = string("s3"); // ERROR! non-const reference not allowed!

    cout
            << s1 << ", "
            << s2 << ", "
            << s3 << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当你对一个临时的const引用时,临时的生命周期被扩展到引用的生命周期(§12.2,引自我的C++ 11 draft n3337的副本):

有两种情况,临时表演在不同于完整表达结束时被摧毁.

...

第二个上下文是引用绑定到临时的.绑定引用的临时对象或绑定引用的子对象的完整对象的临时对象在引用的生命周期内持续存在,除了:

  • 绑定到构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定将持续存在,直到构造函数退出.
  • 函数调用(5.2.2)中的引用参数的临时绑定将持续到包含该调用的完整表达式完成为止.
  • 函数返回语句(6.6.3)中返回值临时绑定的生命周期未扩展; 临时在return语句中的full-expression结束时被销毁.
  • 在new-initializer(5.3.4)中对引用的临时绑定将持续到包含new-initializer的full-expression完成为止.

  • 在C++ 11中,如果使用**右值引用**,则可以对临时引用非const引用.在这个例子中,`foo2()`改为使用**左值引用**. (6认同)

Ker*_* SB 6

您可能会感到惊讶,但您可以将临时表达式的值绑定到常量引用,并且表达式的生命周期将延长到引用的生命周期。但是您不能使用非常量(左值)引用来执行此操作。

  • @aiao:临时的生命周期是它出现的完整表达式的生命周期。实际上,“foo1”和“foo3”是相同的,但如果“foo3”,则临时值仅用于复制初始化变量“s”。 (2认同)