为什么结构化绑定不能按预期在结构上起作用?

时间:2018-12-11 10:06:21

标签: c++ alias standards c++17 structured-bindings

struct X { int a, b; };

int main()
{
    auto p = std::pair{ 1, 2 };
    const auto&[r1, r2] = p; // ok

    X x{ 1, 2 };
    const auto&[r3, r4] = x; // error
}

clang 7.0(在Windows上)的错误消息:

error : cannot decompose this type; 'std::tuple_size<const X>::value' is not a valid 
           integral constant expression

为什么结构化绑定不能按预期在结构上起作用?

1 个答案:

答案 0 :(得分:5)

这是一个已知的错误。参见https://bugs.llvm.org/show_bug.cgi?id=33236

基本上,问题在于,C ++ 17标准指定结构化绑定声明将T视为类似元组的类型,并在定义std::tuple_size<T>::value时使用std::tuple_size<T>;但是它还指定标准库为所有const类型std::tuple_size<T>定义T

这意味着,在编译const auto&[r3, r4] = x;时,Clang查找std::tuple_size<const X>,并在标准库(由MSVC提供)中找到定义。由于已成功找到std::tuple_size<const X>的定义,因此Clang尝试使用“类似元组”的绑定协议,并且肯定失败了:const X根本不像元组!

来自MSVC STL维护者(source)的建议:

  

解决方法:不要在结构上使用const。