Hungry Mind , Blog about everything in IT - C#, Java, C++, .NET, Windows, WinAPI, ...

if block and variable declaration

Известно, что С++ позволяет объявлять переменную в условии блока if:

if (SomeType st = SomeType(...)) {
   ...
}

Удивило, что использовать другой стиль инициализации невозможно:

if (SomeType st(...)) {
   ...
}

А почему?

2 коммент.:

Анонимный комментирует...

Что интересно, в первом случае реально вызова operator= может и не происходить. К bool-у приводится уже сам объект st а не результат operator= для типа SomeType.

Т.е. и в первом и во втором случае инициализации были бы эквивалентны.

Chabster комментирует...

Все это понятно:
8.5 Initializers

If the initialization is direct-initialization, or if it is copy-initialization where the cv-unqualified version
of the source type is the same class as, or a derived class of, the class of the destination, constructors
are considered. The applicable constructors are enumerated (13.3.1.3), and the best one is
chosen through overload resolution (13.3). The constructor so selected is called to initialize the
object, with the initializer expression(s) as its argument(s). If no constructor applies, or the overload
resolution is ambiguous, the initialization is ill-formed.

Подозреваю, что может быть непонятка из-за того, что SomeType st(...) - декларация функции.

Отправить комментарий

Copyright 2007-2011 Chabster