Почему не во время компиляции вернуть 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::string
(с NULL
качестве аргумента и последующим пуфом). Я на правильном пути?
Ответы
Ответ 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
действительно возможно.