2014-09-09 2 views
4

Я не понимаю причину this defect report 1207, более конкретно со ссылкой на следующее предложение (выделено мною):Дефект отчет 1207

Поскольку преобразование имени элемента в выражение члена класса доступа (9.3.1 [class.mfct.non-static], абзац 3) возникает только внутри тела нестатической функции-члена, Тип v в trailing-return-type не является константой, но является const в обратном выражении , что приводит к несоответствию типа между обратным выражением и возвратом t ype функции.

Редактировать

То есть, я не понимаю, почему тип V в типе возвращаемого трейлинг выводится как неконстантная.

ответ

9
vector v; 
auto end() const -> decltype(v.begin()) { return v.begin(); } 

decltype(v.begin()), в задней-возвратного типа, является iterator - потому что v имеет тип vector, видно из внешнего.

Но Внутри корпуса функций рассматривается конструктор-константа функции-члена end(). Тип v - это тип this->v, который, в свою очередь, зависит от константы this.

this 'pointee является const (из-за вышеупомянутой сопзЬ-спецификатора), таким образом, тип this внутри функции члена является block const*.

Поэтому тип this->v внутри функции члена является vector const (из-за доступа к константным-пути), и v.begin() - которая на самом деле (this->v).begin() - вызывает const -overload чей возвращаемый тип const_iterator. С другой стороны, v.begin() в обратном-возвратном типе «вызывает» неконстантную перегрузку, которая возвращает iterator.

Этот тип несоответствие - проблема.

+0

'С другой стороны, v.begin() в обратном-возвратном типе« вызывает »неконстантную перегрузку, которая возвращает итератор.« Хорошо, но почему выбрана непостоянная перегрузка в этом случае? –

+0

Потому что аргумент объекта 'v' (видимый из возвращаемого типа возврата) не является константным. Поэтому разрешение перегрузки обнаруживает, что несогласованная перегрузка будет лучше соответствовать. Но, видимо из типа traling-return-type, 'v' ** должен ** быть const-квалифицированным, поскольку функция-член. – Columbo

+0

Что вы говорите, так это то, что 'const' в объявлении функции-члена не относится к типу возвращаемого возврата. Не могли бы вы предоставить ссылку для этого? –

6

Это говорит, что, когда трейлинг-возвратный тип разобран, член v ищется в достаточно иметь смысл v.begin() .. но фактический доступ к v в контексте сославшейся end() не считается , поэтому ни тот факт, что end() (и, следовательно, его доступ к v) равен const.

+0

Ваш ответ на самом деле помог мне понять его немного лучше, спасибо. – Ven

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