在 C++11 中使用 auto foo = "bar" 与 std::string

Using auto foo = "bar" vs std::string in C++11

我在 C++ 中使用 string::find 搜索子字符串。当我使用 const auto 定义一个字符串并稍后使用该变量时,eclipse. 替换为 ->.

我发现了这个 SO thread 得出的结论是 auto foo = "bar" 被推导为 (const char *) foo = "bar"。所以 eclipse 将 . 转换为 -> 是正确的,尽管我一开始有点困惑。我错误地假设 auto 会变成 std::string.

auto foo = "bar" 推导为 std::string 而不是 const char * 会有 缺点 吗?代码量增加,性能变慢?

您的代码可能有一百万个 类 可以从 const char * 隐式构造。为什么要选择std::string

auto 如果您想要一个具有 相同类型的表达式¹ 的变量,则只需为您节省一些键盘输入,如果您想创建一个不同的对象则不需要。

(1) 或多或少; C++ 总是让事情变得有些棘手...

嗯,很可能,您刚刚回答了自己的问题。 std::string 稍微多一点 space (它有大小计数器),它的创建涉及动态分配等

如今,缺少复杂的字符串类型似乎有些不合时宜,但由于 C++ 的目标是完全替代 C 的低级效率,所以这很容易解释。

此外,std::string 只是一个库 class。您可以选择不同的字符串类型,例如QString or std::experimental::string_view, if your task requires it. BTW, string_view is much more similar to const char[] since it doesn't provide dynamic manipulations at all and can be used in constexpr

"Foobar" 是字符串文字而不是 std::string。这在二进制文件的只读部分中存储为 const char[7]

std::string te 类型有一个从 const char * 的隐式转换,因为它有一个没有显式的参数构造函数,如果你写:std::string s = "foobar"; 就会调用它。请注意,分配器的默认参数是在构造函数上分配的。

使用 const auto 为您提供实际类型而不是转换后的类型。因此,将字符串文字转换为 std::string 实际上会创建另一个引用文字的对象。

http://en.cppreference.com/w/cpp/language/string_literal http://en.cppreference.com/w/cpp/string/basic_string