Я тестировал компилятор С++ 11 в своем исходном коде, и он поймал ошибку в одной из моих функций, которую я ожидал бы от моего компилятора non С++ 11. Я возвращал false из функции, которая имеет тип возврата std::string... Здесь код, демонстрирующий проблему
#include <iostream>
int main ( )
{
std::string str = false;
std::cerr << "'" << str << "'" << std::endl;
return 0;
}
$ g++ test.cpp -W -Wall -Wextra
$ ./a.out
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
Aborted
Я очень удивлен, что этот код компилируется без проблем. Я подозреваю, что из описания исключения заключается в том, что компилятор преобразует false в 0 и затем в NULL и использует это как char *, чтобы попытаться построить строку.
Однако, когда я переключаю false на true, вот что я получаю:
$ g++ test.cpp -W -Wall -Wextra
test.cpp: In function ‘int main()’:
test.cpp:5: error: conversion from ‘bool’ to non-scalar type ‘std::string’ requested
Это более разумный результат, на мой взгляд.
Может кто-то прояснить, почему это, казалось бы, непоследовательное поведение происходит? То есть std::string a = false
компилируется, но генерирует исключение, а std::string a = true
не компилируется.
EDIT:
Для справки, здесь ошибка, сгенерированная с g++ 4.7 с -std = С++ 11 для ложного случая:
test.cpp: In function ‘int main()’:
test.cpp:5:23: warning: converting ‘false’ to pointer type for argument 1 of ‘std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ [-Wconversion-null]
Он принимает NULL, хотя, поскольку CashCow предлагает