【问题标题】:Why does structured binding not work as expected on struct?为什么结构化绑定在 struct 上不能按预期工作?
【发布时间】:2018-12-11 10:06:20
【问题描述】:
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 (on Windows) 的错误信息:

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

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

【问题讨论】:

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


【解决方案1】:

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

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

也就是说,在编译const auto&amp;[r3, r4] = x; 时,Clang 会查找std::tuple_size&lt;const X&gt;,并在标准库(由 MSVC 提供)中找到定义。由于成功找到了std::tuple_size&lt;const X&gt;的定义,Clang尝试使用“tuple-like”的绑定协议,果然失败了:const X不像元组!

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

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

【讨论】:

  • 完美——这正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 2021-05-30
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多