Когда необходимо устранить неоднозначность между объявлениями и выражениями?

[stmt.pre] p6 говорит:

Если условие можно синтаксически разрешить как выражение или объявление, оно интерпретируется как последнее.

Поскольку условие соответствует объявлениям только с инициализатором скобок или равенства, мне трудно придумать пример, который еще не устранил бы неоднозначность в пользу объявлений по другим правилам. Можете ли вы вспомнить какой-нибудь пример?

Если нет, то может быть, этот абзац бесполезен?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот некоторые примеры:

  1. Объявление новой переменной (с избыточными круглыми скобками) и функциональное приведение с последующим вызовом оператора присваивания.
#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";
    }
}

  1. Объявление указателя функции в сравнении с функциональным приведением, оператором вызова и оператором присваивания. (Это пример без лишних скобок (т.е. самый неприятный разбор)).
#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";
    }
}

Оба ваших примера будут работать одинаково хорошо как внутри оператора if, так и снаружи. [stmt.ambig] p1 уже устраняет неоднозначность оператора-выражения «с явным преобразованием типа в стиле функции в качестве крайнего левого подвыражения» в пользу объявлений. Итак, хотя вы не ошибаетесь в отношении этих двусмысленностей, вопрос конкретно требует примера, который «уже не устранен в пользу объявлений по другим правилам», или подтверждения того, что такого примера не существует.

Jan Schultke 12.06.2024 23:38

[stmt.ambig] неприменимо, поскольку у нас нет оператора-выражения. Кажется, что редакционный выбор не изменять [stmt.ambig], чтобы он также включал форму условия «выражение / декларатор фигурной скобки или равного инициализатора», а вместо этого написать дополнительное правило. Теоретически правило для написанного условия шире (любое неоднозначное объявление, а не только возможное функциональное приведение). Я расширю этот ответ, чтобы либо показать пример, либо объяснить, почему это не исключает ничего другого после того, как я пройду все формы. декларатора

Artyer 13.06.2024 14:14

Другие вопросы по теме

Похожие вопросы

Захват битовых полей по ссылке в лямбда-выражении
Инициализировать unordered_set как статическую переменную-член вместо инициализации в конструкторе в C++
OpenCL – Как предотвратить появление ошибок сборки при переходе к стандартной ошибке?
Является ли вставка в вектор при одновременном доступе к вектору неопределенным поведением?
Почему указатели на элементы данных можно вызывать в C++?
Ошибка компиляции при использовании функций шаблона C++, которые принимают в качестве аргументов другие функции, которые принимают ссылки на указатели
Специализация шаблона вне встроенного пространства имен функции, определенной внутри встроенного пространства имен
Как я могу устранить неоднозначность вызова конструктора с параметром из создания именованного экземпляра?
Почему второй вызов std::distance дает разные результаты с std::list?
Почему NativeEvent не регистрирует нажатия клавиш?