Я тестировал компилятор c ++ 11 в моем исходном коде, и он обнаружил ошибку в одной из моих функций, которую я ожидал, что мой компилятор не c ++ 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 = 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 предлагает