'The "(optional)" marker in cppreference.com documentation

Last week, I had a discussion with a colleague in understanding the documentation of C++ features on cppreference.com. We had a look at the documentation of the parameter packs, in particular the meaning of the (optional) marker:

Enter image description here

(Another example can be found here.)

I thought it means that this part of the syntax is optional. Meaning I can omit this part in the syntax, but it is always required to be supported by the compiler to comply with the C++ standard. But he stated that it means that it is optional in the standard and that a compiler does not need to support this feature to comply to the standard. Which is it? Both of these explanations make sense to me.

I couldn't find any kind of explanation on the cppreference web site. I also tried to google it but always landed at std::optional...



Solution 1:[1]

It means that particular token is optional. For instance both these declarations work:

template <class... Args>
void foo();

template <class...>
void bar();

Solution 2:[2]

While I found a page that lists all of the marks, I was unable to find a page that specifies what the marks are intended to mean. Still, I might ask your colleague to take a look at some other pages, with the goal of the colleague abandoning the idea that "optional" means "optional to support". (This is not a definitive argument, but many would find it persuasive.) I found two good examples at Function declaration.

  1. Function declaration:
    noptr-declarator ( parameter-list ) cv(optional) ref(optional) except(optional) attr(optional)
    Focus on cv (short for "const-volatile"), which is marked "optional" and which is "only allowed in non-static member function declarations". Your colleague's interpretation of this marker would mean that compilers do not have to support const member functions, as the const keyword is "optional".

  2. Function definition, the first option for function-body:
    ctor-initializer(optional) compound-statement
    The "optional" part here is the member initializer list (only allowed in constructors). Is your colleague ready to claim that a compiler need not support member initializer lists?

Sometimes one should look at the familiar to understand annotations.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 bolov
Solution 2 JaMiT