2014-11-21 3 views
2

N3797 §13.3.3.1 [over.best.ics] говорит:Неявные преобразования последовательности

Последовательность преобразований является неявное преобразование, как это определено в пункте 4 [...]

Однако, пункт 4 определяет следующий список переходов:

  • именующих-к-RValue преобразования
  • преобразование массив в-указатель преобразования Функции-на-указатель преобразования Квалификационного
  • Интегральные акции
  • Плавающее продвижение точки
  • Интегральных конверсии
  • преобразования с плавающей точкой
  • плавающим неотъемлемых конверсий
  • Преобразование указателей
  • Указатель на конверсии членов
  • булевых преобразований
  • Целое Оценка

преобразования Рассмотрим следующий пример:

#include <iostream> 

using namespace std; 

struct A 
{ 
    operator int() 
    { 
     return 42; 
    } 
}; 

A a; 

int b = a; //User-defined conversion sequence applied 

int main() { } 

До тех пор пока определенное пользователем преобразование не принадлежит к набору стандартных преобразований , в этом примере стандартное преобразование не применяется. Так в чем смысл цитаты, которую я представил?

ответ

0

Остальных цитат вы пропущенные может быть освещая:

§13.3.3.1/1 неявного последовательность преобразования представляет собой последовательность преобразования используется для преобразования аргумента в вызове функции к типу соответствующего параметра вызываемой функции. Последовательность преобразований является неявным преобразованием, как определено в разделе 4, , что означает, что оно регулируется правилами инициализации объекта или ссылки одним выражением (8.5, 8.5.3).

Статья 4 действительно говорит об этом.

3 Выражение e может быть неявно преобразован к типу T тогда и только тогда, когда декларация T t=e; хорошо сформирована, для некоторой изобретенной временной переменной t (8.5).

6 Эффект любого неявного преобразования является таким же, как выполнение соответствующего объявления и инициализации , а затем с использованием временной переменной в результате преобразования.Результатом является lvalue, если T является ссылочным типом lvalue или ссылкой rvalue на тип функции (8.3.2), значение x, если T является ссылкой на ссылочный номер и в противном случае значение prvalue. Выражение e используется в качестве значения glvalue тогда и только тогда, когда инициализация использует его как значение glvalue.

«Полный набор таких преобразований» (перечисленный в разделе 4) относится к стандартным преобразованиям. Помните, что он говорит, что стандартные последовательности преобразования могут быть пустыми. Затем в § 13.3.3.1.2 описываются пользовательские последовательности преобразований. Он состоит из:

  • Стандартная последовательность преобразования
  • определенный пользователем преобразование
  • Другой стандартная последовательность преобразования
+0

Спасибо, но это все-таки не совсем понятно. Стандарт определяет четко сформированную последовательность преобразования немного позже как одно из следующих из: _a стандартной последовательности преобразования (13.3.3.1.1) _, _a пользовательской последовательности преобразования (13.3.3.1.2) _ или _an последовательность преобразования многоточия (13.3.3.1.3) _. –

+0

Или вы подразумевали _implicit sequence sequence_ и _sequence of conversion_, появившийся в цитируемой цитате, это немного разные вещи, не так ли? –

+0

@DmitryFucintv Из того, что я понимаю, стандартная последовательность преобразования * - это неявное преобразование. Я пояснил, что «неявное преобразование, определенное в пункте 4», относится к абзацу, в котором говорится о «неявно преобразованном» *. –

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