我知道auto
,auto&
,const auto
和const auto&
之间的区别(例如在“for each”循环中),但有一件事令我惊讶是:
std::string bla;
const std::string& cf()
{
return bla;
}
int main (int argc, char *argv[])
{
auto s1=cf();
const std::string& s2=cf();
s1+="XXX"; // not an error
s2+="YYY"; //error as expected
}
当有人x
中auto x = fun();
的类型与fun()
的返回值类型不同时,有人可以告诉我吗?
答案 0 :(得分:18)
auto
的规则与模板类型扣除的规则相同:
template <typename T>
void f(T t); // same as auto
template <typename T>
void g(T& t); // same as auto&
template <typename T>
void h(T&& t); // same as auto&&
std::string sv;
std::string& sl = sv;
std::string const& scl = sv;
f(sv); // deduces T=std::string
f(sl); // deduces T=std::string
f(scl); // deduces T=std::string
f(std::string()); // deduces T=std::string
f(std::move(sv)); // deduces T=std::string
g(sv); // deduces T=std::string, T& becomes std::string&
g(sl); // deduces T=std::string, T& becomes std::string&
g(scl); // deduces T=std::string const, T& becomes std::string const&
g(std::string()); // does not compile
g(std::move(sv)); // does not compile
h(sv); // deduces std::string&, T&& becomes std::string&
h(sl); // deduces std::string&, T&& becomes std::string&
h(scl); // deduces std::string const&, T&& becomes std::string const&
h(std::string()); // deduces std::string, T&& becomes std::string&&
h(std::move(sv)); // deduces std::string, T&& becomes std::string&&
一般情况下,如果您需要副本,请使用auto
,如果需要参考,请使用auto&&
。 auto&&
保留了referene的常量,也可以绑定临时(延长它们的生命周期)。
答案 1 :(得分:1)
在g ++ - 4.8中,有一个自动扣除函数返回类型的增强功能:
2012-03-21 Jason Merrill
Implement return type deduction for normal functions with -std=c++1y.
你需要-std = c ++ 1y或-std = gnu ++ 1y标志。
这有效: 汽车 sluggo() { 返回42; }
int
main()
{
auto s1 = sluggo();
s1 += 7;
}
OP问题仅在+="YYY"
按预期出错。您甚至可以使用auto声明cf:
#include <string>
std::string bla;
const auto&
cf()
{
return bla;
}
int
main()
{
auto s1 = cf();
const std::string& s2 = cf();
s1 += "XXX"; // not an error
s2 += "YYY"; // error as expected
}
+="YYY"
仍有错误。