Почему не во время компиляции вернуть nullptr как std :: string? - программирование

Почему не во время компиляции вернуть nullptr как std :: string?

Из-за ошибки я только что обнаружил, что этот код прекрасно компилируется с Visual Studio 17 и, возможно, с другими компиляторами. Теперь мне интересно, почему?

#include <iostream>
#include <string>

std::string foo(){
    return nullptr;
}

int main(){
    auto s = foo();
    std::cout << s << std::endl;
}

Я мог бы предположить, что это потому, что std::basic_string c'tor может быть вызван с помощью char* и при возврате происходит неявное преобразование из ptr в std::stringNULL качестве аргумента и последующим пуфом). Я на правильном пути?

4b9b3361

Ответ 1

Да, ваше предположение верно, будет вызвана проверка конструкторов std::basic_string # 5:

basic_string( const CharT* s,
              const Allocator& alloc = Allocator() );

Обратите внимание, что передача nullptr вызывает неопределенное поведение, как указано в стандарте и примечаниях:

Поведение не определено, если [s, s + Traits::length(s)) не является допустимым диапазоном (например, если s является нулевым указателем).

Ответ 2

Почему он не должен компилироваться? std::string имеет следующий конструктор:

string(const CharT* s, const Allocator& alloc = Allocator());

это создает строку с содержимым, инициализированным копией строки символов с нулевым символом в конце, на которую указывает s. Конструктор не является явным, поэтому неявное преобразование из nullptr в std::string действительно возможно.