代码之家  ›  专栏  ›  技术社区  ›  BiagioF

const上的结构化绑定

  •  3
  • BiagioF  · 技术社区  · 5 年前

    #include <type_traits>
    
    void foo() {
      const std::pair<int, int> x = {1, 2};
    
      auto [a, b] = x;
    
      static_assert(std::is_const_v<decltype(a)>);
      static_assert(std::is_const_v<decltype(b)>);
    }
    

    MSVC公司 缺陷?

    这里的标准并不简单(我看了一下),但是考虑到 auto a b cv限定符

    2 回复  |  直到 5 年前
        1
  •  16
  •   Barry    5 年前

    下面的代码应该编译吗?

    事实并非如此。这是一个MSVC错误。

    A structured binding declaration e

    auto e = x;
    

    E ,并且由于初始值设定项类似于元组,因此绑定的类型由 tuple_element_t<i, E> E pair<int, int> ,所以这两种类型只是 int . 规则 decltype 结构化绑定的作用是 referenced type ,所以 decltype(a) decltype(b) .

    重要的是 a b (结构化绑定)来自发明的变量( E x const 因为你刚刚宣布了 auto . 我们要做的是复制 ,然后将绑定带入这个(非- 常数 )收到。

        2
  •  9
  •   einpoklum    5 年前

    代码中的静态断言 应该

    #include <type_traits>
    
    void foo() {
      const int x_1 = 1;
      const int x_2 = 2;
    
      auto a = x_1;
      auto b = x_2;
    
      static_assert(std::is_const_v<decltype(a)>);
      static_assert(std::is_const_v<decltype(b)>);
    }
    

    哪一个 does indeed fail on MSVC 也。

    在C++中,表达式类型在赋值时衰减。 :的 auto 看到一个 int const int . 结构化绑定只允许您做更多的事情 汽车 一次装订。

    ... 因此,MSVC在代码中的断言上没有失败这一事实似乎是一个bug。