Можно "T t = {};" и "T t {};" дают разные результаты? - PullRequest
14 голосов
/ 25 мая 2020

Вопрос простой. Можно ли построить такой тип T, для которого следующие два объявления переменных будут давать разные результаты?

T t1 = {};
T t2{};

Я копался в cppreference и стандарте уже больше часа, и Я понял следующее:

  • T t2{}; - это инициализация значения . Никаких сюрпризов.
  • T t1 = {} - это инициализация списка с пустым списком в фигурных скобках.

Но последний вариант сложен, поскольку «эффекты инициализации списка» - впечатляющий ... список. Что для классов, фундаментальных типов и агрегатов, похоже, сводится к инициализации значений. Но я не уверен, что ничего не пропустил.

Может быть, вы можете предоставить контекст, в котором два объявления будут иметь разные эффекты?

UPD: Отлично ответы про explicit конструкторы! Следующий уровень: возможно ли, что оба оператора компилируются, но по-разному влияют на время компиляции / выполнения?

Ответы [ 2 ]

7 голосов
/ 25 мая 2020

Если вы рассмотрите случай, в котором один оператор будет компилироваться, а другой не будет компилироваться как «разные эффекты», тогда да, вот контекст:

#include <iostream>

class T {
public:
    int data{ 0 };
    explicit T() {
        data = 0;
        std::cout << "Default constructor" << std::endl;
    }
};

int main()
{
    T t1 = {};
    T t2{};
    return 0;
}

Строка объявления / инициализации t1 дает следующее, с clang-cl:

ошибка: выбранный конструктор явно указан при инициализации копирования

Компилятор MSVC также жалуется:

ошибка C2512: 'T': нет подходящего конструктора по умолчанию сообщение: Конструктор для класса 'T' объявлен 'явным'

4 голосов
/ 25 мая 2020

Разница в explicit. Мне удалось сделать разницу в msv c, но похоже на ошибку компилятора:

#include <iostream>
#include <initializer_list>

struct T
{
    template<class... A>
    T(A...) {std::cout << "1\n";}
    explicit T() { std::cout << "2\n"; }

};


int main()
{
    T t1 = {}; // 1
    T t2{}; // 2
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...