I found another question which was answered a long time ago and did not really understand one of the answers. Eddie's answer, in his answer he stated that if you used String mystring = 'x'; then x will be converted to an int and call String(int). Why does this statement call the constructor? I thought that in order to use a constructor you had to use a statement like String mystring('x'). Is the assignment operator = equivalent to creating a new instance of an object?
 
    
    - 1
- 1
 
    
    - 43
- 7
- 
                    possible duplicate of [What is a converting constructor in C++ ? What is it for?](http://stackoverflow.com/questions/15077466/what-is-a-converting-constructor-in-c-what-is-it-for) – Oct 19 '14 at 01:30
- 
                    = is not an operator in that statement. – chris Oct 19 '14 at 01:31
- 
                    @chris Could you explain what `=` is in that statement? I've always thought it was assigning the left hand side to the right hand side. – AdaptVPerish Oct 19 '14 at 01:35
- 
                    It's simply not an operator, just an alternative use for the same symbol. Like how `f(a,b)` doesn't use the comma operator if `f` is a function, or how `int *p` doesn't use the dereferencing operator or multiplication operator. It's called copy-initialization. – chris Oct 19 '14 at 01:36
- 
                    @chris I am having a hard time finding documentation on this, say if there was a constructor that accepted 2 arguments, would it be possible to use `=` in that case? – AdaptVPerish Oct 19 '14 at 01:48
- 
                    @AdaptVPerish [cppreference's page on copy initialization](http://en.cppreference.com/w/cpp/language/copy_initialization) gives a good summary. – Oct 19 '14 at 01:48
- 
                    @AdaptVPerish, Yes, in C++11. `struct S {S(int, int);}; S s = {2, 3};` is classified as copy-initialization. Before that, you could still technically do `S s = S(2, 3);`. – chris Oct 19 '14 at 02:04
- 
                    The title has nothing to do with the question itself. – AlanWik Jan 21 '22 at 17:26
1 Answers
T t(x) is called direct-initialization and T t = x is called copy-initialization. Copy-initialization doesn't use assignment even = is used. Because it's used at the point of declaration it is a form of initialization.
During copy-initialization, if the type of the initializer doesn't match the type of the object being created, then a converting-constructor searched for and called (if available) to convert the initializer. The result is a temporary instance which is either copy or move-constructed into the object.
For example, since 'x' doesn't match the type of String, an appropriate constructor is searched for and used to convert 'x' to a String instance. The String::String(int) constructor is chosen and the result is a temporary instance String('x'). Then (since the temporary is an rvalue), if a move-constructor is available, the temporary will be move-constructed into mystring and otherwise copy-constructed.
if there was a constructor that accepted 2 arguments, would it be possible to use
=in that case?
Yes, you can use a braced-initializer to supply multiple arguments. It will search for the best constructor for each argument:
struct Square
{
    Square(float width, float height);
};
int main()
{
    // copy-initialization:
    Square square = {2.5, 4.0}; // calls Square(2.5, 4.0)
}
But note that if there is a constructor that takes std::initializer_list of the same type, then that will override the behavior shown above: it will call the initializer list constructor instead.
 
    
    - 94,763
- 41
- 167
- 253
- 
                    Just a quick query on the example you just showed: Isn't there anything like `move-initialization`? If yes, then I think, your comment should say `move-initialization` instead of `copy-initialization` as the temporary will be moved to create `square` object. Am I right or missed something? – aniliitb10 Jan 25 '18 at 10:45
- 
                    @aniliitb10 Yes it would be more accurate to say move-initialization, but when we say "copy" we mean it could either be an actual copy or a move. But it turns out that in the example I showed, a copy/move doesn't occur since I'm using list-initialization. It's no different than using direct-list-initialization (`Square square{2.5, 4.0}`). – David G Jan 25 '18 at 16:49