首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用struct Initializer为公共成员变量赋值不会产生编译器错误?

使用struct Initializer为公共成员变量赋值不会产生编译器错误?
EN

Stack Overflow用户
提问于 2020-02-01 12:42:19
回答 3查看 66关注 0票数 2

在下面的C++代码中,为什么与赋值运算符一起使用的结构初始化器不会生成编译器错误?

这是一个编译器错误吗?

它能在每个编译器上工作吗?

这到底是什么类型的任务?

代码语言:javascript
代码运行次数:0
运行
复制
class vector2D
{
    public :
        double x,y;
};

int main()
{
    vector2D v1;
    v1 = {1,2} ; // why does this compile and work?
}
EN

回答 3

Stack Overflow用户

发布于 2020-02-01 13:31:03

它是一个编译器错误吗?

不是的。

它能在每个编译器上工作吗?

它可以在所有兼容C++11 (或更高版本)的编译器上编译。

这到底是什么类型的任务?

它是从使用列表初始化创建的临时对象中赋值的。

票数 5
EN

Stack Overflow用户

发布于 2020-02-01 12:53:25

赋值的右侧可以是带括号的init列表:它被转换为要赋值的某种适当类型的值(通常是左侧类型)。它可以如此转换只是聚合初始化,就像C语言永远以某种形式(以及最近的复合字面量)一样。

票数 1
EN

Stack Overflow用户

发布于 2020-02-01 13:28:08

如果类没有显式定义的赋值运算符,则存在隐式定义的赋值运算符。

在您的示例中,有一个隐式定义的复制赋值运算符,其形式为

代码语言:javascript
代码运行次数:0
运行
复制
vector2D& operator=(vector2D const& rhs);

您可以在这种赋值的右侧使用任何表达式,只要它可以转换为vector2D const&。在您的例子中,{1, 2}确实满足了这一要求。出于这个原因,

代码语言:javascript
代码运行次数:0
运行
复制
v1 = {1,2};

没问题。就好像你用过:

代码语言:javascript
代码运行次数:0
运行
复制
v1 = vector2D{1,2};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60014059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档