Что за скобки в выражении std::true_type{}?

Что это за {} в выражении
bool trueValue = true_type{};

И почему следующий код корректно выводит Hello, World?
#include <iostream>

class hello {
	public:
	operator std::string() {
		return "Hello, World!";
	}
};

int main(int argc, char** argv)
{
	std::string helloWorld = hello{};
	std::cout << helloWorld;
	return 0;
}
  • Вопрос задан
  • 66 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Универсальный инициализатор Си++11. В нём может быть что угодно: параметры конструктора, initializer_list, поля структуры… Ваш код эквивалентен коду
std::string helloWorld(std::move(hello().operator std::string()));

Вроде верно — раньше, НЯЗ, в helloWorld вызывался op= КОНСТРУКТОР КОПИРОВАНИЯ, а сейчас С СИ++17 конструктор.
Для временных объектов вызывается версия string(string&&), я это обозначил как string(std::move()).
Ну и для преобразования hello в string используется hello::op string.
hello(), или, начиная с Си++11, hello{} — это создание временного объекта с помощью конструктора по умлочанию.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
На сколько я понимаю, в вашем примере вполне можно заменить фигурные скобки на круглые и ничего не изменится.
Но если бы в классе hello был бы конструктор, принимающий std::initializer_list, то в случае использования фигурных скобок вызвался бы именно этот конструктор, а не конструктор по умолчанию, даже если фигурные скобки пустые.
Сделайте оба конструктора и проверьте, какой из них вызывается с фигурными скобками и с круглыми.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы