Еще одна проблема с decltype - PullRequest
0 голосов
/ 22 февраля 2011
template<class IntT, IntT low = IntT(), IntT high = IntT()>
struct X 
{
    static_assert(std::is_same<decltype(low),decltype(high)>::value,"Different types not allowed");//this should give error if types are different
    decltype(low) a;
    decltype(high) b;
    X():a(decltype(a)()),b(decltype(b)())//WHY THIS DOES NOT COMPILE?
    {
        cout << typeid(a).name() << '\n';
        cout << typeid(b).name() << '\n';
    }
};

int _tmain(int argc, _TCHAR* argv[])
{


    X<char,1,'a'> x;//this according to static_assert shouldn't compile but it does

    return 0;
}

Использование VS2010.
Пожалуйста, смотрите 3 комментария в коде выше.

Ответы [ 3 ]

4 голосов
/ 22 февраля 2011

Первое, что стоит отметить, VS2010 устарел и был сломан в день выпуска.Ключевое слово decltype было особенно проблематичным и работает только для самых основных целей.На самом деле многие базовые вещи совершенно неверны.

Далее код ...

template<class IntT, IntT low = IntT(), IntT high = IntT()>
struct X 
{
    static_assert(std::is_same<decltype(low),decltype(high)>::value,"Different types not allowed");//this should give error if types are different

Но они никогда не будут.

    decltype(low) a;
    decltype(high) b;

Вам не нужен decltype здесь.Тип IntT.

    X():a(decltype(a)()),b(decltype(b)())//WHY THIS DOES NOT COMPILE?

Поскольку VS2010 не работает и, как правило, не позволяет использовать выражение decltype, как если бы оно было типом.Определение типа перед рукой может быть лучше.

К счастью, вам это не нужно, поскольку вы можете просто использовать конструктор по умолчанию, а не копию.

int _tmain(int argc, _TCHAR* argv[])
{


    X<char,1,'a'> x;//this according to static_assert shouldn't compile but it does

Нет.Static_assert проверяет, совпадают ли типы.Они оба char с значениями 1 и 'a'.

    return 0;
}

Похоже, вы пытаетесь создать шаблон так, чтобы тип второго и третьего параметровоснованы на любом разрешенном типе значения, которое вы передаете в него.Это не может быть сделано.

3 голосов
/ 22 февраля 2011

static_assert компилируется, потому что decltype параметров шаблона low и high - char. Посмотрите на определение вашего шаблона и создание экземпляра. IntT <- char </p>

По умолчанию инициализировать ваших членов вы можете написать это:

X():a(),b()
{
1 голос
/ 22 февраля 2011
X():a(decltype(a)()),b(decltype(b)())//WHY THIS DOES NOT COMPILE?

GCC компилирует это нормально. Смотрите это: http://www.ideone.com/DG7rt

Похоже, это ошибка компилятора MSVC ++ 10!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...