Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is the C++20 concept not compatible with "const auto&"?

template<typename T>
concept Octet = 1 == sizeof(T);

// ok
Octet decltype(auto) c = 'a';

// ok
void f1(const auto&) {}

// ok
void f2(Octet auto) {}

// ok
void f3(Octet auto&&) {}

// error: expected ‘auto’ or ‘decltype(auto)’ after ‘Octet’
void f4(Octet const auto&) {}

// error: cannot declare a parameter with ‘decltype(auto)’
void f5(Octet decltype(auto)) {}

Compiled with gcc-11 -std=c++20. See: https://godbolt.org/z/xK769Pfjn

Why do f4 and f5 not work?

like image 336
xmllmx Avatar asked May 07 '21 18:05

xmllmx


People also ask

Can const and auto be declared together?

C++ auto auto, const, and references It can be modified with the const keyword and the & symbol to represent a const type or a reference type, respectively. These modifiers can be combined.

How do you declare a concept in C++?

Let's define a few concepts in this post. A concept can be defined by a function template or by a variable template. A variable template is new with C++14 and declares a family of variables. If you use a function template for your concept, it's called a function concept; in the second case a variable concept.


1 Answers

As seen in [dcl.spec.auto], when you use a placeholder here, the constraint needs to immediately precede the auto:

placeholder-type-specifier:
type-constraint_opt auto
type-constraint_opt decltype ( auto )

This is simply a matter of syntax. The constraint isn't a general specifier like const is; it doesn't have a flexible position. Conceptually, you can think of Octet auto as one "word" representing the constrained type.

As for f5, this is not allowed as a parameter per p2:

A placeholder-type-specifier of the form "type-constraint_opt auto" can be used as a decl-specifier of the decl-specifier-seq of a parameter-declaration of a function declaration...

No such text exists for decltype(auto). In addition, per p6:

A program that uses a placeholder type in a context not explicitly allowed in this subclause is ill-formed.

Logically, I'm not sure how I'd specify decltype(auto) to work in this context. Sure, it could be specified, but I don't think there's precedent in the language for it, so it would need to be motivated over an alternative that already has the desired effect.

like image 63
chris Avatar answered Oct 11 '22 22:10

chris