После обширного чтения ISO/IEC 14882, язык программирования - C++, я все еще не уверен, почему const
необходим для неявного преобразования в пользовательский тип с помощью одного конструктора аргументов, такого как следующий
#include <iostream>
class X {
public:
X( int value ) {
printf("constructor initialized with %i",value);
}
}
void implicit_conversion_func( const X& value ) {
//produces "constructor initialized with 99"
}
int main (int argc, char * const argv[]) {
implicit_conversion_func(99);
}
Начиная с раздела 4, строка 3
Выражение e может быть неявно преобразовано в тип T тогда и только тогда, когда объявление T t = e; хорошо сформирована, для некоторой изобретенной временной переменной t (8.5). Для некоторых языковых конструкций требуется, чтобы выражение было преобразовано в логическое значение. Выражение e, отображаемое в таком контексте, называется контекстно преобразованным в bool и хорошо сформировано тогда и только тогда, когда декларация bool t (e); хорошо сформирована, для некоторой изобретенной временной переменной t (8.5). Эффект либо неявного преобразования является таким же, как выполнение объявления и инициализации, а затем использование временной переменной в результате преобразования. Результатом является lvalue, если T - ссылочный тип lvalue (8.3.2) и rvalue в противном случае. Выражение e используется как lvalue тогда и только тогда, когда инициализация использует его как lvalue.
После этого я нашел раздел инициализаторов, относящихся к пользовательским типам в 8.5 строке 6
Если программа вызывает инициализацию по умолчанию объекта с типом const, T, то T должен быть типом класса с предоставленным пользователем конструктором по умолчанию.
Наконец, я оказался в 12.3 строке 2 о пользовательских преобразованиях, в которых говорится:
Пользовательские преобразования применяются только там, где они недвусмысленны (10.2, 12.3.2).
Излишне говорить, что 10.2 и 12.3.2 не отвечали на мой вопрос.
- Может кто-то пролить свет на то, что эффект
const
имеет на неявные преобразования? - Использует ли использование
const
преобразование "однозначно" по 12,3 строке 2? -
const
лиconst
либо эффект lvalue vs. rvalue, о котором говорится в разделе 4?