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
为什么结构化绑定不能按预期在结构上起作用?
答案 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。