После подробного прочтения ISO / IEC 14882, Язык программирования - C ++ я все еще не уверен, зачем нужен const
для неявного преобразования в пользовательский тип с конструктором с одним аргументом, как показано ниже
#include
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
Если программа вызывает инициализация по умолчанию объекта типа T с определением const, T должен быть типом класса с предоставленным пользователем конструктором по умолчанию.
- Может ли кто-нибудь пролить свет на то, какое влияние
const
оказывает на неявные преобразования?- Делает ли использование
const
преобразование «однозначным» согласно 12.3, строка 2?- ] Влияет ли
const
каким-либо образом на lvalue по сравнению с rvalue, о котором говорилось в разделе 4?