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

Why does structured binding not work as expected on struct?

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

为什么结构化绑定在结构上无法按预期工作?

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

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

也就是说,在编译const auto&[r3, r4] = x;的时候,Clang寻找std::tuple_size<const X>,在标准库(MSVC提供)中找到定义。由于成功找到 std::tuple_size<const X> 的定义,Clang 尝试使用 "tuple-like" 绑定协议,但它确实失败了:const X 一点也不像元组!

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

Workaround: don’t use const on the struct.