2015-04-10 1 views
5

Пожалуйста, обратите внимание на следующий код:Почему я не могу использовать указатель constexpr в качестве параметра шаблона в C++ 11?

template <typename T, typename P, T P:: *s> struct H {}; 

struct AA { int i; }; 

int main() 
{ 
    typedef int AA::*PI; 
    constexpr PI pi = &AA::i; 

    H<int, AA, &AA::i> h1; // OK 
    // H<int, AA, pi> h2;  // compile error 
} 

У меня есть указатель член pi указывающий на AA::i. pi является переменной constexpr. Почему я не могу использовать его в качестве параметра шаблона, хотя напрямую работает &AA::i?

ответ

6

Потому что это правила, по крайней мере, на C++ 11; 14.3.2/1 разрешает «указатель на элемент, выраженный как описано в 5.3.1», который описывает синтаксис &AA::i.

Это изменилось в latest draft, и теперь требование для любого типа является просто «преобразованным постоянным выражением типа шаблона-параметра», в соответствии с которым ваш код будет в порядке.

Я не знаю, является ли это изменение в C++ 14, так как у меня пока нет доступа к этому опубликованному стандарту.

+0

DIS для C++ 14 это N4141 Я думаю, что вы можете проверить у GitHub самостоятельно. –

+2

Тем не менее, я сравнил их, и действительно, изменение было применено только * после * C++ 14. –

+0

Спасибо за ваш искренний ответ! –

Смежные вопросы