3

在我的程序中,我有

stringstream strumien(); //1
stringstream strumien;  // 2
strumien<<"napis "<<8<<endl;

第一行产生以下错误

'std::stringstream() {aka std::basic_stringstream()}' 和 'const char [7]' 类型的无效操作数到二进制 'operator<<'

但第二个工作正常。(当然总是其中一个被注释掉)
那么它们之间有什么区别?因为我一直认为它们是一个对象的平等定义。

4

3 回答 3

8

看起来像函数声明的东西函数声明。那是

T name();

声明了一个函数,称为name不带参数并返回一个T. 这被称为最令人烦恼的解析。有两个潜在的解决方法可以避免这个问题:去掉括号或使用 C++2011“统一初始化”(这是一个严重的误称):

T name{};
于 2013-08-11T20:04:27.223 回答
1

第一行实际上是一个声明。即使它看起来和你的第二个一样,它也不是......

所以

T name();

声明一个函数name返回一个类型的对象T

C++ 标准说明了这种歧义:

6.8 歧义解决[stmt.ambig]

涉及表达式语句和声明的语法存在歧义:将函数样式显式类型转换作为其最左边的子表达式的表达式语句与第一个声明符以 ( 开头的声明无法区分。在这些情况下,语句是一个声明

这种歧义也被称为The Most Vexing Parse


自 C++11 以来有一种新的方法可以解决这个问题,它被称为统一初始化语法

它的工作原理如下:

T name{};
于 2013-08-11T20:19:02.603 回答
0

第一行在形式语法中是模棱两可的:它可以解释为函数声明,也可以解释为具有无参数构造函数的对象的声明和实例化。该语言选择将其视为函数声明,因为可以放弃括号来调用无参数构造函数。

于 2013-08-11T20:06:45.750 回答