在我的节目中我有
stringstream strumien(); //1
stringstream strumien; // 2
strumien<<"napis "<<8<<endl;
并且第一行生成以下错误
类型'std :: stringstream()的无效操作数{aka std :: basic_stringstream()}'和'const char [7]'到二进制 '运营商LT;&LT;'
但第二个正常工作。 (当然总是其中一个被评论出来)
那么他们之间有什么区别?因为我一直认为它们是对象的相同定义。
答案 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构造函数。