Я тестировал компилятор С++ 11 на своем исходном коде, и он обнаружил ошибку в одной из моих функций, которую, как я ожидал, поймает мой компилятор, отличный от С++ 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
не компилируется.
РЕДАКТИРОВАТЬ:
Для справки, вот ошибка, сгенерированная с g++ 4.7 с -std=c++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