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

xml*_*lmx 13 c++ standards alias 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
}
Run Code Online (Sandbox Code Playgroud)

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

error : cannot decompose this type; 'std::tuple_size<const X>::value' is not a valid 
           integral constant expression
Run Code Online (Sandbox Code Playgroud)

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

cpp*_*ner 8

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

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

这意味着,在编译时const auto&[r3, r4] = x;,Clang会查找std::tuple_size<const X>,并在标准库中找到该定义(由MSVC提供).由于std::tuple_size<const X>成功找到了定义,Clang尝试使用"类似元组"的绑定协议,它肯定会失败:const X就像元组一样!

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

解决方法:不要在struct上使用const.