Прямая инициализация как
std::istringstream stream("blah blah");
необходимо, когда тип в вопросе, здесь std::istringstream
из стандартной библиотеки С ++, не доступный конструктор копирования.
инициализация копии, как
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" };
}
Таким образом, существуют существенные различия.
Я обычно предпочитаю синтаксис инициализации копирования из-за ясности. Но иногда, как показано выше, прямая инициализация, к сожалению, необходима. Некоторые люди, например.Автор текста в стиле C++ Фрэнсис Стеклобор, вместо этого приземлился на прямую инициализацию в качестве своего предпочтительного синтаксиса инициализации (я не уверен, почему это менее ясно для моих глаз и представляет проблему «самого неприятного разбора»), и для них это необходимость копирование в некоторых случаях, что является неудачным.
Приветствия & НТН.,
Что такое неявное присваивание? Вы имеете в виду оператор присваивания по умолчанию? – ybungalobill 2010-11-27 20:02:47
Что вы подразумеваете под «неявным назначением». – 2010-11-27 20:03:08
bool bValue1 = true; // Явное назначение bool bValue2 (false); // неявное назначение Это имеет значение? – Mike 2010-11-27 20:11:12