В «языке программирования C++» 4 страницы издания 164:Нужна помощь пониманию «{} -initializer синтаксис минимизирует шансы неудачных преобразований»
Когда мы явно указать тип объекта, мы инициализация, У нас есть два типа для рассмотрения: тип объекта и тип инициализатор. Например:
char v1 = 12345; // 12345 is an int int v2 = 'c'; // 'c' is a char T v3 = f();
с помощью клавиша {} -initializer синтаксиса для таких определений, мы уменьшаем шансов на печальные превращения:
char v1 {12345}; // error : narrowing int v2 {'c'}; // fine: implicit char->int conversion T v3 {f()}; // works if and only if the type of f() can be implicitly converted to a T
Я не совсем понимаю фразы minimize the chances for unfortunate conversions
и комментарий для T v3 {f()};
что он works if and only if the type of f() can be implicitly converted to a T
. Рассмотрим следующие два случая:
- a) Если T имеет явный конструктор, принимающий аргумент типа f().
- б) Если тип F() имеет оператор преобразования для некоторого типа X и Т имеет конструктор, принимающий аргумент типа X.
В обоих случаях, тип F() может» t неявно преобразуется в T, но T v3 {f()}
хорошо сформирован, поэтому, по крайней мере, часть этого комментария кажется неприемлемой? (Также не уверены, правильная ли часть if
.)
И для обоих случаев это T v3 = f();
, что плохо сформировано, так что же означает здесь предложение minimize the chances for unfortunate conversions
? Кажется, что {} -инициализатор фактически принимает больше форм преобразования (является ли это неудачным или нет, это другой вопрос). (Предотвращение сужения иллюстрируется в случае v1
, и это понятно. Я смущен насчет v3
.)
Как я уже сказал в вопросе: «Предотвращение сужения проиллюстрировано в случае с v1, и это понятно. Я смущен о v3'». Спасибо, в любом случае. – goodbyeera