[stmt.pre] p6 говорит:
Если условие можно синтаксически разрешить как выражение или объявление, оно интерпретируется как последнее.
Поскольку условие соответствует объявлениям только с инициализатором скобок или равенства, мне трудно придумать пример, который еще не устранил бы неоднозначность в пользу объявлений по другим правилам. Можете ли вы вспомнить какой-нибудь пример?
Если нет, то может быть, этот абзац бесполезен?





Вот некоторые примеры:
#include <iostream>
struct Y {
bool did_assign = false;
Y(int) {}
Y& operator=(int) { did_assign = true; return *this; }
operator bool() { return did_assign; }
};
int main() {
Y y = 0;
if (Y(y) = 0) {
std::cout << "declaration\n";
}
if ((Y(y) = 0)) {
std::cout << "expression\n";
}
}
#include <iostream>
int r;
int* x = &r;
struct Y {
Y(int) {}
Y operator()() { return 0; }
bool operator=(int) { return true; }
};
int main() {
if (Y(*x)() = 0) {
std::cout << "declaration\n";
}
if ((Y(*x)() = 0)) {
std::cout << "expression\n";
}
}
[stmt.ambig] неприменимо, поскольку у нас нет оператора-выражения. Кажется, что редакционный выбор не изменять [stmt.ambig], чтобы он также включал форму условия «выражение / декларатор фигурной скобки или равного инициализатора», а вместо этого написать дополнительное правило. Теоретически правило для написанного условия шире (любое неоднозначное объявление, а не только возможное функциональное приведение). Я расширю этот ответ, чтобы либо показать пример, либо объяснить, почему это не исключает ничего другого после того, как я пройду все формы. декларатора
Оба ваших примера будут работать одинаково хорошо как внутри оператора if, так и снаружи. [stmt.ambig] p1 уже устраняет неоднозначность оператора-выражения «с явным преобразованием типа в стиле функции в качестве крайнего левого подвыражения» в пользу объявлений. Итак, хотя вы не ошибаетесь в отношении этих двусмысленностей, вопрос конкретно требует примера, который «уже не устранен в пользу объявлений по другим правилам», или подтверждения того, что такого примера не существует.