Прямая инициализация подобно
std::istringstream stream( "blah blah" );
необходима, когда рассматриваемый тип, здесь std::istringstream
из стандартной библиотеки C ++, не имеет доступного конструктора копирования.
A инициализация копирования , как и
std::istringstream stream = "blah blah"; //! NOT VALID
, требует доступного конструктора копирования, потому что он выполняется так, как будто временный объект создается справа от =
, икак будто это временное затем используется для инициализации объявленной переменной.
В другом направлении, в C ++ 98 необходим синтаксис инициализации копирования для использования фигурных скобок инициализаторов .Например, прямая инициализация не может быть использована для инициализации агрегата.Но вы можете использовать инициализацию копирования с помощью инициализатора фигурных скобок:
#include <string>
using namespace std;
struct Answer
{
int nVotes;
string description;
};
int main()
{
Answer const incorrect = { 26, "they're the same!" };
Answer const correct = { -1, "nah, they're different, actually" };
}
Итак, есть существенные различия.
Я обычно предпочитаю синтаксис инициализации копирования из-за ясности.Но иногда, как показано выше, прямая инициализация, к сожалению, необходима.Некоторые люди, например, автор учебника по С ++ Фрэнсис Глассбороу, вместо этого получили прямую инициализацию в качестве предпочтительного синтаксиса инициализации (я не уверен, почему, на мой взгляд, это менее понятно и представляет проблему «самого неприятного анализа»), и для нихв некоторых случаях это является необходимостью инициализации копирования, что вызывает сожаление.
Cheers & hth.,