为什么以下代码在C++11
中编译而在C++03
中不编译? (gcc
和cl
)
#include <string>
#include <iostream>
#include <fstream>
int main(int argc, char* argv[]) {
const std::string t("Hello");
std::ofstream out(t);
}
为什么C++03
流不接受std::string
作为构造函数参数? 这个决定是基于某些事情还是偶然发生的?
答案 0 :(得分:9)
使用严格符合C ++ 03的编译器编译时代码失败,因为只有std::string
的构造函数才被添加到C ++ 11中。
至于问题,“它是基于智能的东西”,因为添加了 接口,可以推断出没有技术理由可以省略它。
这是一个额外的便利,因为如果你有一个std::string
,你总是可以调用.c_str()
来获得一个适合与旧接口一起使用的C字符串。 (正如C ++ 11中的文档所说,带std::string
的构造函数与完全的效果与调用相应的构造函数相同,后者使用const char*
调用的结果字符串上的.c_str()
。)
答案 1 :(得分:5)
我记得,几年前在clc ++上讨论过这个问题。而Andrew Koenig(我认为是Andrew,无论如何)说它实际上是在一些会议期间提出的,但是接受string
的想法很快就与接受wstring
的想法混为一谈,并从那里变成了关于文件名中对国际化字符集的支持的讨论,并且......之后不久整个想法被删除了,因为它已经打开了一大堆没有人准备好处理的蠕虫。
答案 2 :(得分:2)
他们忘记了在C ++ 03中添加string
构造函数。现在已经修好了。这一次忘记了其他事情,比如make_unique
。总有一些人可以做的事情。 C ++ 03也忘了为函数模板指定默认参数,现在包含它们。
编辑:正如@Charles所说,它可能不是字面意思“忘记”,而是明确应该存在的东西,但是没有由于某种原因而被指定。进一步的例子由std::next
/ std::prev
提供,这是一个很大的缓解,而std::to_string
和std::stoi/d/ul/ull
,这又是完全合理的,但没有人知道如何指定它们直到这一轮。他们之前缺席的原因并不一定。