Разница в конструкции объекта с использованием «X x (42)» и «X x = 42»? - PullRequest
7 голосов
/ 20 марта 2012

Допустим, у нас есть класс X с определенным конструктором X(int value).

Это семантически эквивалентно или нет?

X x = 42;
X x(42);

Я полагаю, что разница появится только в том случае, если мы добавим явное ключевое слово в конструктор X. В противном случае компилятор уменьшит выражениеX x = 42; до X x(42);

Пожалуйста, поправьте меня, если я ошибаюсь.

Ответы [ 2 ]

7 голосов
/ 20 марта 2012

Форма

X x = 42;

требует, чтобы конструктор был неявным и чтобы был доступный конструктор копирования. Реализации разрешено создавать временные и копировать их, но ни одна из известных мне реализаций не делает этого.

5 голосов
/ 20 марта 2012

Семантически две операции различаются в зависимости от языка в спецификации, но эффективные результаты после компиляции одинаковы при следующих обстоятельствах:

  1. Для X существует конструктор с одним аргументом, которыйможет принимать целочисленный тип, а тип аргумента не является неконстантной ссылкой на l-значение
  2. Для X существует конструктор с одним аргументом, где целочисленный тип может быть преобразован в тип аргумента, игде аргумент опять не является неконстантной ссылкой l-значения
  3. В случае # 2 конструктор не объявлен как explicit
...