在重载operator =看似不一致的行为中的错误=在变量定义中使用

时间:2014-08-26 12:41:25

标签: c++

为什么不编译?不应该编译吗?我不明白什么? (使用g ++ -std = c ++ 1y)

struct S{
    int a,b;
    void operator=(int x){a=x;b=x*x;}
};

int main(){
    S s0=S{15,20};
    S s1;s1=5;
    S s2;s2=7;
    S s3=9;
}

main.cpp:10:7:错误:从'int'转换为非标量类型'S'请求

在我看来,“S s1; s1 = 5;”和“S s1 = 5;”至少应该是一个天真的用户所期望的!这是不是真的有充分的理由吗?

1 个答案:

答案 0 :(得分:3)

S s1 = 5;S s1; s1 = 5;不相同。

第一个是为正在创建的对象5提供初始值设定项s1的声明。没有任务。 (=符号在声明中的用途与在语句中的用途不同 - &*等。

第二个声明s1,默认构造它;然后调用赋值运算符。

S s1 = 5;完全等同于S s1 { S(5) };,但临时S(5)通常会进行复制省略。