УчитываяЧто формальный из константной ссылке 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
компиляций, некоторые исключения делать с шаблонами, но это действительно так – каковы формальные правила атрибутов стандарта здесь?
Правила [dcl.ref]/p1 «Cv квалифицированных ссылки плохо сформированы, за исключением, когда CV-определители введены через использование ЬурейеГо-имя * * (7.1.3, 14.1) или * decltype-specifier * (7.1.6.2), и в этом случае cv-квалификаторы игнорируются. " – 0x499602D2
На английском: ссылки всегда являются константами. Вы не можете изменить их, как указатели. – Fozi
'-Wignored-qualifiers' работает для' clang' –