2016-02-27 58 views
0

我正在使用C++中的string::find搜索子字符串。当我使用const auto定义了一个字符串并稍后使用了该变量时,eclipse.替换为->在C++中使用auto foo =“bar”vs std :: string 11

我发现这个SO thread其结论是auto foo = "bar"推断为(const char *) foo = "bar"。所以日食是正确的转换.->即使我有点困惑开始。我错误地认为auto将成为std::string

会有下行推导auto foo = "bar"std::string而不是const char *?代码大小增加,性能下降?

+7

类型' “栏”''是为const char [4]'。我不知道你为什么认为这应该被自动转换为'std :: string'。 – IInspectable

+0

我认为你很容易混淆这个事实,即你可以将一个'const char *'或'const char [4]'赋值给一个字符串:'std :: string str =“bar”;'引号之间的任何内容只是一个普通的const char数组。 –

+1

如果你想让这个类型成为'std :: string'就这么说。不要在这里使用'auto'。 –

回答

6

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

auto简单地节省了一些键盘,如果你想有一个变量,同类型expression¹的键入你的,不是你想创建一个不同的对象。

(1)或多或少;事情总是会因为C++而变得有些毛骨悚然......

3

好吧,你可能刚刚回答了你自己的问题。 std :: string需要稍微更多的空间(它有大小计数器),它的创建涉及动态分配等。

缺乏复杂的字符串类型可能看起来像时代错误,但是由于C++面向完全替代C其低效率,这是非常可以解释的。

此外,std::string只是一个库类。你可以选择不同的字符串类型,例如QStringstd::experimental::string_view,如果你的任务需要它。 BTW,string_view更加类似于const char[],因为它并没有提供所有的动态操作,并且可以在constexpr

+0

谢谢。这确实就像是在和别人说话,第二天突然意识到为什么auto默认为char *。我非常感谢你们三位花时间回答。 – kometen

2

用“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

+2

'“foobar”'的类型不是'char const *',它是'char const [7]'(6'char's +终止空字符) – Praetorian

+0

是的。但在这种情况下几乎没有实际的区别。 – Alex

相关问题