【问题标题】:Error with Clang , compile fine with MSVCClang 出错,用 MSVC 编译正常
【发布时间】:2023-01-13 17:22:18
【问题描述】:

Clang 与 -std=c++2b:

错误:没有用于初始化“POD”的匹配构造函数

MSVC 19.latest with /std:c++latest :编译成功

#include <vector>
struct POD {
  int a;
  int b;
  int c;
};

int main()
{
    POD my_pod(1,2,3);
    return 0;
}

这样就可以阻止对构造函数的大量转发调用(例如 std::vector&lt;a&gt;::emplace_back(1,2,3) 也不适用于 Clang)

谁是对的?

我发现能够在这些 POD 结构上使用默认构造函数而无需定义所有内容非常方便。

【问题讨论】:

  • POD my_pod; 正在使用默认构造函数。 POD my_pod(1,2,3) 没有调用默认构造函数。
  • POD my_pod{1,2,3}; 应该与两者一起工作
  • 铿锵是对的。但是您可以使用聚合初始化。 POD my_pod{1,2,3};push_back({1,2,3}); 无处不在。
  • 根据我的经验,MSVC 从来都不是对的......
  • @463035818_is_not_a_number:是的,{} 初始化适用于两者。但是调用 (1,2,3) 没有像我说的那样编译阻止其他用法。如果您有 POD 向量,则不能使用 emplace_back,它会阻止大量使用。

标签: c++ visual-c++ clang c++23


【解决方案1】:

您需要使用 aggregate initialization 构建您的 struct POD,即

POD my_pod{1,2,3};

FWIW,“POD”类型的概念自 C++20 以来一直是 deprecated,你应该避免使用这个术语(尽管,不可否认,很难摆脱 POD 的概念,因为它是如此直接和容易)。

【讨论】:

  • op:谁是对的?
【解决方案2】:

你的POD结构是一个总计的,为此你需要使用aggregate initialization

POD my_pod = { 1, 2, 3 };

【讨论】:

  • op:谁是对的?
  • 好的有些巧合:D
  • 对不起,我不小心编辑了你的回复......我的错
猜你喜欢
  • 2017-10-17
  • 2020-06-03
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
相关资源
最近更新 更多