I am a C++ beginner, so sorry if the question is too basic.
I have tried to collect the string constrcturs and try all them out (to remember them).
strin
Compiler interprets string strA()
as a function prototype of a function which takes void arguments and returns an object of string type. If you want to create a empty string object use string strA;
(without paranthesis)
It prints 1
because pointers to functions are always converted to numeric as true
.
This is a very popular gotcha. C++ grammar is ambiguous. One of the rules to resolve ambiguities is "if something looks like declaration it is a declaration". In this case instead of defining a variable you declared a function prototype.
string strA();
is equivalent to
string strA(void);
a prototype of a no-arg function which returns string.
If you wish to explicitly call no-arg constructor try this:
string strA=string();
It isn't fully equivalent - it means 'create a temporary string using no-arg constructor and then copy it to initialize variable strA', but the compiler is allowed to optimize it and omit copying.
EDIT: Here is an appropriate item in C++ FAQ Lite
tkopec is right on why it doesn't work. To answer your second question, here's how you check the type:
template<typename TEST> void Error_() {
TEST* MakeError = 1;
}
By calling Error_(StrA);
you will get a compile error, and your compiler will probably tell you that it happened in Error_< std::basic_string<char, std::allocator<char> > (*)(void)>(std::basic_string<char, std::allocator<char> > (*)(void))
Now, std::basic_string > is just std::string, so this really means Error_< std::string (*)(void)> (std::string (*)(void))
. The part between '<>' is repeated between '()', and that's the sype of strA. In this case, std::string (*)(void)
.
I don't think that in this case, the rule "if it could be a declaration, it's taken to be a declaration" applies. Since in the following, both things are declarations
string a;
string a();
The one is the declaration of an object, and the other is the declaration of a function. The rule applies in other cases. For example, in this case:
string a(string());
In that case, string()
can mean two things.
string
The fule applies here, and string()
is taken to mean the same as the following, named parameter (names are irrelevant in parameters when declaring a function)
string a(string im_not_relevant());
If a function takes as parameter an array or another function, that parameter decays into a pointer. In case of a function parameter, to a pointer to the function. Thus, it is equivalent to the following, which may look more familiar
string a(string (*im_not_relevant)());
But in your case, it's rather the syntax that's getting into the way. It's saying that the following is a function declaration. It can never be the declaration of an object (even though that was probably intended by the programmer!)
string a();
So there is no ambiguity in this context in the first place, and thus it declares a function. Since string
has a user defined constructor, you can just omit the parentheses, and the effect remains the same as what was intended.
In C++, as in C, there is a rule that says that anything that looks like a declarartion will be treated as a declaration.
string strA();
looks like a function declaration, so it is treated as one. You need:
string strA;