Boost 1.55, MSVC express 2012. Неверная оценка выражения с помощью трибуны. Он работает корректно только тогда, когда я указываю dictool (false) явно.C++ boost tribool trernary operator неверное значение
Мораль истории: компилятор выбирает ТИПЫ на основе ЦЕННОСТЕЙ.
auto a = 0? indeterminate : false; // type function pointer
auto b = 0? indeterminate : true; // type bool
Выход:
- indet: 1? неопределенный: false
- номер: 0? неопределенный: false
- true: 1? неопределенный: true
- true: 0? неопределенный: true
- indet: 1? неопределенный: tribool (false)
- false: 0? неопределенный: tribool (false)
- indet: 1? неопределенный: tribool (true)
- true: 0? неопределенный: tribool (истина)
Исходный код:
#include <iostream>
#include <boost/logic/tribool.hpp>
using namespace boost;
void test_tribool(const tribool& v, const char* name)
{
const char* s;
if (v)
s = "true";
else if (!v)
s = "false";
else
s = "indet";
std::cout << s << "\t: " << name << std::endl;
}
#define TEST_TRIBOOL(...) test_tribool((__VA_ARGS__), #__VA_ARGS__);
int main(int argc, char** argv)
{
TEST_TRIBOOL(1? indeterminate : false);
TEST_TRIBOOL(0? indeterminate : false);
// warning C4305: ':' : truncation from 'bool (__cdecl *)(boost::logic::tribool,boost::logic::detail::indeterminate_t)' to 'bool'
TEST_TRIBOOL(1? indeterminate : true);
// warning C4305: ':' : truncation from 'bool (__cdecl *)(boost::logic::tribool,boost::logic::detail::indeterminate_t)' to 'bool'
TEST_TRIBOOL(0? indeterminate : true);
TEST_TRIBOOL(1? indeterminate : tribool(false));
TEST_TRIBOOL(0? indeterminate : tribool(false));
TEST_TRIBOOL(1? indeterminate : tribool(true));
TEST_TRIBOOL(0? indeterminate : tribool(true));
return 0;
}
Что * точно * бывает, что вы не ожидали? Вам нужен такой код, чтобы продемонстрировать его? И почему ваш макрос использует '...', если он работает только с одним аргументом? –
Вы понимаете, что в 'a? b: c', 'b' и' c' должны иметь один и тот же тип, и компилятор рассказал вам, каким образом он разрешил конфликт в вашем коде, да? –
Я могу сделать работу с кодом, но мне просто интересно, почему (2) является тем, чем он является. Как это возможно? Я использую ... в макросе, потому что он универсален. –