std::string s() 奇怪行为

5
我发现了一些奇怪的东西,我不理解。
std::string a();

当打印出来时,它返回1。我不知道它从哪里来。我认为a()是一个没有参数的构造函数,但看起来不是这样。
我在哪里可以找到关于这个的信息?这是什么?
而在尝试执行std::string b(a);时,编译器会报错:
error: no matching function for call to ‘std::basic_string<char>::basic_string(std::string (&)())’

希望能够得到解释。


3
谷歌搜索 "c++ most vexing parse"。 - Jon
6
请参见:http://zh.wikipedia.org/wiki/%E6%9C%80%E7%83%A6%E8%AF%B7%E5%8F%A5%E5%88%86%E6%9E%90 - Paul R
4
大家,为什么要投反对票?难道当问题困扰你们时,答案就显而易见了吗?关闭问题并标记为重复是好的,但我们不应该因为别人不知道就责备他们。请友善对待。 - Jon
1
@Jon:对于一些人来说(包括我自己,因为我曾经遇到过类似的错误信息,它揭示了这是一个函数指针,就像帖子中的错误一样。有时候阅读错误信息是有用的),但我个人认为它大多数情况下并不显示任何研究努力。 - PlasmaHH
@PlasmaHH:在我看来,如果你没有足够的经验,那么这个错误信息是毫无用处的。大多数新手都无法应对这种情况。话虽如此,我还是尊重你的意见(特别是你花时间解释了它!),如果我发现jaor有不研究的习惯,我也不会评论。但事实上,我认为我们应该给他们一个机会,相信他们是无心之失。 - Jon
@Jon:虽然认识到std::string (&)()是一个函数的引用确实不容易,但我希望人们至少会尝试去理解它;如果是这种情况,那么问题应该是像“我不知道这个std::string (&)()是什么,有人能告诉我吗?”。即使是“我完全不理解这个错误,也不知道从哪里开始”,也表明了努力,但目前看来更像是(夸张的)“这里有一个错误,不想读它,解释给我听”。好在SO有一个投票系统,所以它可以捕捉到许多意见。 - PlasmaHH
2个回答

5
这是一个函数声明,而不是字符串实例化:
std::string a();

它声明了一个名为a的函数,没有参数,并返回一个std:string。以下是实例化的操作:

std::string a;   // C++03 and C++11
std::string b{}; // C++11 syntax

3
std::string a();

声明一个没有参数且返回类型为std::string的函数。当你试图打印它时,你会打印地址,该地址将被评估为true

警告:'std::string a()'的地址始终将被评估为'true'[-Waddress]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接