Why is the assignment operator not called in this

2019-01-27 01:28发布

From the wikipedia page for copy constructors:

X a = X();     

// valid given X(const X& copy_from_me) but not valid given X(X& copy_from_me)
// because the second wants a non-const X&
// to create a, the compiler first creates a temporary by invoking the default constructor
// of X, then uses the copy constructor to initialize as a copy of that temporary. 
// For some compilers both versions actually work but this behaviour should not be relied 
// upon because it's non-standard.

Specifically the part:

" the compiler first creates a temporary by invoking the default constructor of X, then uses the copy constructor to initialize as a copy of that temporary. "

My question is (assuming this is correct) why is this so? From the code, I would guess that the compiler would use the assignment operator after constructing an X.

I'm guessing its because assignment takes place in the same expression as initialization?

Also, what would be the reason to use this formula, rather than just a normal initialization X a; or if you want to copy X a(b); ?

标签: c++ oop
2条回答
Animai°情兽
2楼-- · 2019-01-27 02:12

Because the code is constructing an object. The = sign here is initializing, not assigning. You can only assign to an existing object, not to one that's under construction.

查看更多
Lonely孤独者°
3楼-- · 2019-01-27 02:23

It's simply a matter of understanding the grammar of C++. The statement X a = X(); is a declaration statement with initializer, and not an assignment expression. The grammatical meaning of this statement is to declare a variable a of type X and copy-initialize it from the expression X(). There is no assign­ment involved here in any way.

查看更多
登录 后发表回答