C++ 为什么是;自动const&&引用;不是只读的吗? #包括 int main() { int-xa=1; int-ya=2; auto const&[xb,yb]=std::tuple(xa,ya); xb=9;//这不应该是只读的吗? 返回xa+ya; }

C++ 为什么是;自动const&&引用;不是只读的吗? #包括 int main() { int-xa=1; int-ya=2; auto const&[xb,yb]=std::tuple(xa,ya); xb=9;//这不应该是只读的吗? 返回xa+ya; },c++,reference,constants,auto,C++,Reference,Constants,Auto,这不仅编译,而且返回11 所以有两个问题: 当xb被指定为自动常量时,为什么允许我写入?这不应该编译失败吗 为什么我不能用“auto&”替换“auto const&”并编译它?Clang(6.0)和g++(7.3)都会发出错误消息,如“类型的非常量左值引用无法绑定到tuple的临时类型” 谢谢 您将获得对int的非常量引用元组的常量引用。然后将该元组分解为两个非常量引用。要使int references常量,需要使int references常量: #include <tuple>

这不仅编译,而且返回11

所以有两个问题:

  • 当xb被指定为自动常量时,为什么允许我写入?这不应该编译失败吗

  • 为什么我不能用“auto&”替换“auto const&”并编译它?Clang(6.0)和g++(7.3)都会发出错误消息,如“类型的非常量左值引用无法绑定到tuple的临时类型”

  • 谢谢

  • 您将获得对int的非常量引用元组的常量引用。然后将该元组分解为两个非常量引用。要使int references常量,需要使int references常量:

    #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;
    }
    
    autoconst&[xb,yb]=std::tuple(xa,ya);
    
  • 您正在创建的元组是一个未命名的临时元组,因此无法将非常量引用绑定到它,即使该引用本身未命名


  • 我同意这是一个重复的问题,但这是一个简单得多的例子。为更多扭曲的初始化规则欢呼……是否最好将另一个问题标记为这个问题的重复,因为这个问题更清楚?@Galik是的,如果这个问题得到了一个好的答案。@liliscent:人们可以忽略,但他们很少这样做。质量问题。
    auto const& [xb, yb] = std::tuple<const int&, const int&>(xa, ya);