为什么结构化绑定不能按预期在结构上工作?
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.
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.