Is it legal C++ to pass the address of a static const int with no definition to a template?

后端 未结 4 419
刺人心
刺人心 2021-01-15 11:53

I\'m having trouble deciding whether not this code should compile or if just both compilers I tried have a bug (GCC 4.2 and Sun Studio 12). In general, if you have a static

相关标签:
4条回答
  • 2021-01-15 11:57

    Interesting, it compiled fine for me on VS 2008. I kind of assumed that the error came from the typedef because at compile time when it tries to compile 'B' with &x as the template type it doesn't then know where the address of x will be. Still... it compiles and gives a reasonable output.

    0 讨论(0)
  • 2021-01-15 12:08

    You are trying to pass a runtime value to a template, that's not possible. The only allowed template parameters are types (class/typename) or integral constant values (int/bool/etc).

    0 讨论(0)
  • 2021-01-15 12:15

    To be a well formed program you stil have to have the defintion of the static variable (without an initializer in this case) if it actually gets used, and taking the address counts as a use:

    • C++2003 Standard: 9.4.2 Static data members Paragraph 4 (bold added)

    If a static data member is of const integral or const enumeration type, its declaration in the class definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that case, the member can appear in integral constant expressions. The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition shall not contain an initializer

    0 讨论(0)
  • 2021-01-15 12:17

    I could see how one might expect this to compile anyway.

    The address of a static const isn't really a runtime value and can be fully resolved at link time.

    0 讨论(0)
提交回复
热议问题