Consider this simple example:
struct Class {
struct Inner {};
static Inner a;
};
I cannot define this a
with this syntax:
auto Class::a = Inner{};
- gcc and msvc both complaint in a similar ways:
<source>:9:6: error: conflicting declaration 'auto Class::a'
9 | auto Class::a = Inner{};
| ^~~~~
<source>:6:18: note: previous declaration as 'Class::Inner Class::a'
6 | static Inner a;
| ^
but clang accepts this code.
Of course the reason for this syntax is to not repeat Class::
twice:
Class::Inner Class::a{};
So, the question - is it correct (clang is right) or incorrect (gcc and msvc are right)?
It's core issue #2389. Clang is right, the code is valid.
2389. Agreement of deduced and explicitly-specified variable types
Section: 9.2.9.7 [dcl.spec.auto] Status: CD6 Submitter: Nina Ranns Date: 2018-10-24
The Standard does not explicitly address whether an example like the following is well-formed or not:
struct S { static int i; }; auto S::i = 23;
There is implementation divergence on the handling of this example.
Notes from the July, 2019 meeting
Editorially add the example as well-formed; see editorial issue 2979.
CWG 2019-09-16
Approved editorial change 3227.
It has already been applied to C++20 as can be seen in [dcl.spec.auto.general]/p13.
Being a CD6 status (CD6: A DR/DRWP or Accepted/WP issue not resolved in C++20 but included in the Committee Draft advanced for balloting at the July, 2022 WG21 meeting), it appears that GCC hasn't implemented it yet.