gpt4 book ai didi

c++ - 为什么在此示例中出现错误 C2797?

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:38 25 4
gpt4 key购买 nike

我有以下代码:

struct X
{
int a, b;
};

class Y
{
public:
Y(const X& x) : x_{x} {}; // C2797 error

private:
X x_;
};

使用 MSVC2013 更新 3 编译,它提示 C2797 error .如果我用括号(即 x_(x))替换花括号,程序编译成功。

为什么会这样?此编译器行为是否符合 C++11 标准? C++14 呢?

编辑:为了更清楚,我不确定上面的 x_{x} 是否应该根据标准调用 X(std::initializer_list) 或者它是否是调用 X(const X&) 的有效语法。据我所知,是后者。我说得对吗?

最佳答案

来自标准:

— If T is an aggregate, aggregate initialization is performed.

[...]

— Otherwise, if T is a class type, constructors are considered. The applicable constructors are enumerated and the best one is chosen through overload resolution (13.3, 13.3.1.7). If a narrowing conversion (see below) is required to convert any of the arguments, the program is ill-formed.

在上面的上下文中,x_{x} 不会调用复制构造函数,因为X 是一个集合。它将尝试聚合初始化,其中:

  • 在 MSVC 中,未实现。当 Xstd::string 时,MSVC 似乎也无法编译,这不是聚合,因此它可能存在一些 C++11 合规性问题。

  • 在 gcc 中,它已实现,但程序格式错误且无法编译(试图从 {const X 初始化期望 {int, int} 的聚合

关于c++ - 为什么在此示例中出现错误 C2797?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26567969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com