stringstream object()和object之间有什么区别?

时间:2013-08-11 20:02:04

标签: c++

在我的节目中我有

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

并且第一行生成以下错误

  

类型'std :: stringstream()的无效操作数{aka   std :: basic_stringstream()}'和'const char [7]'到二进制   '运营商LT;&LT;'

但第二个正常工作。 (当然总是其中一个被评论出来)
那么他们之间有什么区别?因为我一直认为它们是对象的相同定义。

3 个答案:

答案 0 :(得分:8)

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

T name();

声明一个名为name的函数,它不带参数并返回T。这称为Most Vexing Parse。有两个可能的修复方法可以避免这个问题:关闭括号或使用C ++ 2011“统一初始化”(这是一个用词不当):

T name{};

答案 1 :(得分:1)

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

所以

T name();

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

C ++标准规定了这种模糊性:

  

6.8歧义解决[stmt.ambig]

     

涉及表达式语句和声明的语法存在歧义:具有函数式显式类型转换的表达式语句,因为其最左侧的子表达式与第一个声明符以(a <。strong)开头的声明无法区分。 >在这些情况下,声明是声明。

这种含糊不清也称为The Most Vexing Parse


自C ++ 11以来,有一种新方法可以解决这个问题,它被称为uniform initialization syntax

它的工作原理如下:

T name{};

答案 2 :(得分:0)

第一行在形式语法中是不明确的:要么它可以被解释为函数声明,要么声明和实例化具有无参数构造函数的对象。语言选择将其视为函数声明,因为可以放弃括号来调用no-arg构造函数。