Какова цель последнего предложения в [dcl.fct.spec]/4?

[dcl.fct.spec]/4:

В явном спецификаторе константное-выражение, если оно указано, должно быть контекстно преобразованным постоянным выражением типа bool ([выражение.конст]). Явный спецификатор explicit без константное-выражение эквивалентно явному-спецификатору explicit(true). Если константное выражение имеет значение true, функция явная. В противном случае функция не является явной. А ( токен, следующий за explicit, анализируется как часть явный спецификатор.

Какова цель последнего предложения выше? Разве это не очевидно из первого определения грамматического термина «явный спецификатор», приведенного ниже?

явный спецификатор:

 explicit ( constant-expression )
 explicit 

Обратите внимание, что struct foo { (foo)(){} }; компилируется; и struct foo { explicit (foo)(){} }; не удается скомпилировать из-за вышеуказанного правила, делающего ( частью «явного спецификатора». Без вышеуказанного правила это было бы неоднозначно.

Richard Critten 22.04.2024 02:08
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Действует следующее:

struct A {
    (A)(/*...*/); //1
};

//1 объявляет конструктор A со списком параметров /*...*/. Это разрешено, поскольку грамматика деклараторов позволяет добавлять дополнительные круглые скобки в разных местах, например. вокруг идентификатора декларатора A.

Тогда возникает вопрос, как

struct A {
    explicit (A)(/*...*/); //2
};

следует интерпретировать.

Раньше в C++20 //2 означало бы, что у нас есть та же сигнатура конструктора, что и в //1, но помеченная explicit, а грамматика C++20 без рассматриваемого предложения по-прежнему позволяла бы анализировать его таким образом, анализируя (A) как часть явный спецификатор не будет работать, поскольку () не является допустимым синтаксисом декларатора и A не является выражением.

Предложение, о котором вы спрашиваете, приводит к тому, что вторая интерпретация делает его неверным. В предложении не содержится конкретного аргумента относительно того, почему, но я полагаю, что оно предназначено для того, чтобы избежать ошибок, поскольку что-то вроде

struct A {
    explicit(A) (/*...*/); //3
};

похоже, что explicit(A) был явным спецификатором, хотя, согласно самой грамматике, он не будет анализироваться таким образом.

Это также упоминается как критическое изменение в [diff.cpp17.class]/1.

Насколько я могу судить, это только делает ранее правильно сформированный код плохо сформированным. Я не думаю, что без этого предложения существует какая-либо двусмысленность. Единственный некорректный код — это объявления с дополнительными круглыми скобками вокруг идентификатора декларатора, которые, вероятно, никто не использует на практике.

который, вероятно, никто не использует на практике" обязательный xkcd.

Passer By 22.04.2024 08:12

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