присвоение true/false std::string: что происходит?

Я тестировал компилятор С++ 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

15
задан vmpstr 12 March 2012 в 16:35
поделиться