在 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
我在 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