2015-03-17 2 views
3

УчитываяЧто формальный из константной ссылке C++ (не ссылаться на константные, но константной ссылке)

template< class Type > 
void constref(Type const) {} 

void constref_call() { double x; constref<double&>(x); }  // OK 

template< class Type > 
using reference = Type&; 

void foo(reference< const int > const x) { (void) x; }  // OK 

template< class Type > 
void foot(reference< const Type > arg) { (void) arg; } 

void foot_call() { foot(3.14); }  // Deduces arg type no problem. 

void foo2(int const& const x) { (void) x; }     // ! 

С как Visual C++ и G ++ этот код компилируется, как указано в комментариях, только с foo2 спровоцировать ошибку компиляции ,

Я хотел бы foo аналогично привести к ошибке компиляции, для того, чтобы иметь возможность использовать эти обозначения с теми же ограничениями, как “ неудавшегося эксперимента ” операторной записи на главном языка.

Я подозреваю, что причина, по которой foo компилирует такая же, как причина, почему вызов в constref_call компиляций, некоторые исключения делать с шаблонами, но это действительно так – каковы формальные правила атрибутов стандарта здесь?

+2

Правила [dcl.ref]/p1 «Cv квалифицированных ссылки плохо сформированы, за исключением, когда CV-определители введены через использование ЬурейеГо-имя * * (7.1.3, 14.1) или * decltype-specifier * (7.1.6.2), и в этом случае cv-квалификаторы игнорируются. " – 0x499602D2

+0

На английском: ссылки всегда являются константами. Вы не можете изменить их, как указатели. – Fozi

+0

'-Wignored-qualifiers' работает для' clang' –

ответ

4

Цитирование C++ 11, 8.3.2/1:

... Cv-квалифицированные ссылки являются плохо образованы исключением случаев, когда CV-определители вводятся через использование ЬурейеЕ (7.1. 3) или аргумента типа шаблона (14.3), и в этом случае cv-квалификаторы игнорируются. ...

+0

Спасибо. По-видимому, это означает, что нет возможности гарантировать диагностику? –

+1

@ Cheersandhth.-Alf Поскольку программа хорошо сформирована, я бы сказал, что такого способа действительно нет. – Angew