字符串流对象()和对象之间的区别是什么

What is the difference between stringstream object() and object?

本文关键字:对象 区别 之间 是什么 字符串      更新时间:2023-10-16

在我的程序中,我有

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

并且第一行生成以下错误

类型"std::stringstream()"的无效操作数{akastd::basic_stringstream()}'和'const-char[7]'转换为二进制'运算符<lt;'

但第二种方法效果良好。(当然,其中总是有一个被评论掉)
那么它们之间有什么区别呢?因为我一直认为它们是物体的平等定义。

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

T name();

声明了一个名为name的函数,该函数不接受任何参数并返回一个T。这被称为最Vexing解析。有两个潜在的解决方案可以避免这个问题:去掉括号或使用C++2011"统一初始化"(这是一个严重的误称):

T name{};

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

所以

T name();

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

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

6.8模糊度分辨率[stmt.ambig]

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

这种模糊性也被称为"最模糊解析"。


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

它的工作方式如下:

T name{};

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