class Foo {
public:
static const char *constant_string;
};
auto Foo::constant_string = "foo";
int main(void) {
};
Compiled with: gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 like this:
gcc -std=c++0x ./foo.cc
./foo.cc:6:11: error: conflicting declaration ‘auto Foo::constant_string’
./foo.cc:3:22: error: ‘Foo::constant_string’ has a previous declaration as ‘const char* Foo::constant_string’
./foo.cc:6:11: error: declaration of ‘const char* Foo::constant_string’ outside of class is not definition [-fpermissive]
Is this intended behavior of the auto
keyword, or a bug in gcc+
C++11 introduces the keyword auto as a new type specifier. auto acts as a placeholder for a type to be deduced from the initializer expression of a variable. With auto type deduction enabled, you no longer need to specify a type while declaring a variable.
The auto keyword directs the compiler to use the initialization expression of a declared variable, or lambda expression parameter, to deduce its type.
Which keyword should be used to declare the static member functions? Explanation: The member functions which are to be made static, must be preceded with the keyword static. This indicates the compiler to make the functions common to all the objects.
auto is used for a local variable defined within a block or function. register is used to store the variable in CPU registers rather memory location for quick access. Static is used for both global and local variables. Each one has its use case within a C program.
It's disallowed by the language:
[C++11: 7.1.6.4]:
1 The
auto
type-specifier signifies that the type of a variable being declared shall be deduced from its initializer or that a function declarator shall include a trailing-return-type.2 The
auto
type-specifier may appear with a function declarator with a trailing-return-type (8.3.5) in any context where such a declarator is valid.3 Otherwise, the type of the variable is deduced from its initializer. The name of the variable being declared shall not appear in the initializer expression. This use of
auto
is allowed when declaring variables in a block (6.3), in namespace scope (3.3.6), and in a for-init-statement (6.5.3).auto
shall appear as one of the decl-specifiers in the decl-specifier-seq and the decl-specifier-seq shall be followed by one or more init-declarators, each of which shall have a non-empty initializer.4The
auto
type-specifier can also be used in declaring a variable in the condition of a selection statement (6.4) or an iteration statement (6.5), in the type-specifier-seq in the new-type-id or type-id of a new-expression (5.3.4), in a for-range-declaration, and in declaring a static data member with a brace-or-equal-initializer that appears within the member-specification of a class definition (9.4.2).5A program that uses
auto
in a context not explicitly allowed in this section is ill-formed.
It's hard to prove a negative, but there's simply no explicit rule in the standard to allow auto
in your case.
However, the same rules mean that the following is valid:
struct Foo {
static constexpr auto constant_string = "foo";
};
int main() {}
(Note that the type of Foo::constant_string
is char const* const
rather than, say, char const[3]
; this is an effect of using auto
.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With