为什么“auto const&”不是只读的?

时间:2018-04-21 15:21:44

标签: c++ reference const auto

#include <tuple>

int main()
{
    int xa = 1;
    int ya = 2;

    auto const& [xb, yb] = std::tuple<int&, int&>(xa, ya);

    xb = 9; // Shouldn't this be read-only?

    return xa + ya;
}

这不仅可以编译,还可以返回11.

所以有两个问题:

  1. 为什么在指定为自动const&amp;?时允许写入xb?难道这不能编译吗?

  2. 为什么我不能取代“auto const&amp;”与“汽车&amp;”并编译? Clang(6.0)和g ++(7.3)都抱怨错误消息,例如“类型&lt; ...&gt;的非常量左值引用无法绑定到类型元组的临时值&lt; ...&gt;”

  3. 谢谢!

1 个答案:

答案 0 :(得分:8)

  1. 您正在获取对int的非const引用元组的const引用。然后,您将该元组分解为两个非const引用。要使int引用为const,需要使int引用为const:

    auto const& [xb, yb] = std::tuple<const int&, const int&>(xa, ya);
    
  2. 您正在创建的元组是一个未命名的临时元素,因此您无法将非const引用绑定到它,即使该引用本身未命名。