Ответ 1
return {};
указывает: "Возвращает объект возвращаемого типа функции, инициализированный пустым list-initializer". Точное поведение зависит от типа возвращаемого объекта.
Из cppreference.com (потому что OP отмечен С++ 11, я исключил правила в С++ 14 и С++ 17, см. ссылка для получения дополнительной информации):
- Если список braced-init пуст, а T - тип класса со стандартным конструктором, выполняется инициализация значения.
- В противном случае, если T является агрегатным типом, выполняется агрегатная инициализация.
- В противном случае, если T является специализацией std:: initializer_list, объект T инициализируется с прямой инициализацией или копируется в зависимости от контекста из списка braced-init-list.
В противном случае конструкторы T рассматриваются в двух фазах:
- Все конструкторы, которые принимают std:: initializer_list как единственный аргумент, или как первый аргумент, если остальные аргументы имеют значения по умолчанию, проверяются и сопоставляются разрешением перегрузки по одному аргументу типа std:: initializer_list
- Если предыдущий этап не дает соответствия, все конструкторы T участвуют в разрешении перегрузки против множества аргументов, которые состоят из элементов списка с привязкой-инициализацией, с ограничением, допускающим только не суживающиеся преобразования, Если этот этап создает явный конструктор как наилучшее совпадение для инициализации списка копий, компиляция не выполняется (обратите внимание, что при простой инициализации копии явные конструкторы вообще не рассматриваются).
В противном случае (если T не является типом класса), если бит-init-list имеет только один элемент и либо T не является ссылочным типом, либо является ссылочным типом, который совместим с типом элемент, T является прямым инициализацией (в инициализации прямого списка) или инициализируется с копией (в инициализации списка копий), за исключением того, что сужение конверсий не допускается.
- В противном случае, если T является ссылочным типом, который несовместим с типом элемента. (это не удается, если ссылка является ссылкой на константу без ссылки)
- В противном случае, если в файле braced-init-list нет элементов, T инициализируется значением.
Прежде чем С++ 11, для функции, возвращающей std::string
, вы бы написали:
std::string get_string() {
return std::string();
}
Используя синтаксис привязки в С++ 11, вам не нужно повторять тип:
std::string get_string() {
return {}; // an empty string is returned
}
return NULL
и return nullptr
следует использовать, когда функция возвращает тип указателя:
any_type* get_pointer() {
return nullptr;
}
Однако NULL
устарел с С++ 11, потому что это просто псевдоним целочисленного значения (0), а nullptr
- тип реального указателя:
int get_int() {
return NULL; // will compile, NULL is an integer
}
int get_int() {
return nullptr; // error: nullptr is not an integer
}