【问题标题】:Using struct Initializer to assign values to public member variables doesn't generate compiler error?使用 struct Initializer 为公共成员变量赋值不会产生编译器错误?
【发布时间】:2020-02-01 04:42:19
【问题描述】:

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

这是编译器的错误吗?

它适用于所有编译器吗?

实际上是哪种作业?

class vector2D
{
    public :
        double x,y;
};

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

【问题讨论】:

    标签: c++ variable-assignment list-initialization


    【解决方案1】:

    这是编译器的错误吗?

    没有。

    它适用于所有编译器吗?

    它将在所有符合 C++11(或更高版本)的编译器上编译。

    实际上是哪种作业?

    它是通过列表初始化创建的临时对象的赋值。

    【讨论】:

      【解决方案2】:

      赋值的右边可以是一个braced-init-list:它被转换成某个适当类型的值(通常是左边的类型)来赋值.它可以被如此转换只是 聚合 初始化,甚至 C 已经以某种形式永远存在(以及最近的复合文字)。

      【讨论】:

        【解决方案3】:

        当一个类没有显式定义的赋值运算符时,存在一个隐式定义的赋值运算符。

        在您的情况下,有一个隐式定义的表单复制赋值运算符

        vector2D& operator=(vector2D const& rhs);
        

        您可以使用此类赋值右侧的任何表达式,只要它可以转换为vector2D const&。在您的情况下,{1, 2} 确实满足该要求。因此,

        v1 = {1,2};
        

        没问题。就好像你用过:

        v1 = vector2D{1,2};
        

        【讨论】:

        • {1, 2} 不是表达式;有一个语法规则,赋值运算符后面可以跟大括号列表
        猜你喜欢
        • 2014-09-03
        • 2014-10-09
        • 2015-12-11
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        相关资源
        最近更新 更多