Ответ 1
Они отличаются, если класс имеет конструктор с пометкой "Явный". Тогда один из них не работает.
В противном случае нет разницы.
int value = 5; // this type of assignment is called an explicit assignment
int value(5); // this type of assignment is called an implicit assignment
В чем разница между теми, если таковые имеются, и в каких случаях различают явное и неявное назначение и как?
http://weblogs.asp.net/kennykerr/archive/2004/08/31/Explicit-Constructors.aspx
EDIT: я на самом деле только что нашел эту статью, которая делает все это намного понятнее... и возникает другой вопрос, если вы (вообще) отмечаете конструкторы, принимающие один параметр примитивного типа - numeric/bool/string - как явные и оставить все остальное, как они есть (конечно, следить за gotchas, таких как конструкторы, такие как (int, SomeType = SomeType())
?
Они отличаются, если класс имеет конструктор с пометкой "Явный". Тогда один из них не работает.
В противном случае нет разницы.
Ни одно из них не является назначением любого типа - они оба являются инициализацией. Первая использует инициализацию копирования и вторую прямую инициализацию. (FWIW, я уверен, что раньше никогда не слышал терминов "явное назначение" или "неявное присвоение" ).
Изменить: (В основном в ответ на комментарий Натана):
Здесь скорректированная версия кода из вашего комментария:
#include <iostream>
struct Foo {
Foo() {
std::cout << "Foo::ctor()" << std::endl;
}
Foo(Foo const& copy) {
std::cout << "Foo::cctor()" << std::endl;
}
Foo& operator=(Foo const& copy) {
std::cout << "foo::assign()" << std::endl;
return *this;
}
};
int main(int, const char**) {
Foo f;
Foo b(f);
Foo x = b;
return 0;
}
Результатом выполнения этого должно быть:
Foo::ctor()
Foo::cctor()
Foo::cctor()
Если вы запустите его и получите foo::assign()
, выбросьте свой компилятор и запустите тот, который работает (ах, и дайте нам знать, какой компилятор он так сильно сломал)!
Только первое - это назначение. Они оба инициализируются.
Изменить: на самом деле, я ошибаюсь. Также не назначаются.