Question

Can auto be used for static class variable definition?

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)?

 4  104  4
1 Jan 1970

Solution

 4

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.

2024-07-02
rustyx