如果函数 f() 返回一个指针,这是正确的:auto* v = f() 或 auto v = f()
If function f() returns a pointer, which is correct: auto* v = f() OR auto v = f()?
我几乎到处都使用 c++11 auto
关键字。不过,我不确定在这种情况下我是否正确使用它。请考虑以下简单示例:(http://ideone.com/TxLJlx)
#include <iostream>
const char* f()
{
return "Hello";
}
int main()
{
auto s1 = f();
auto* s2 = f();
std::cout << s1 << std::endl;
std::cout << s2 << std::endl;
return 0;
}
auto
和auto*
似乎都在工作,并且似乎在做同样的事情。这个假设是错误的吗?
为什么两者给出相同的结果?
在这种情况下,auto
的正确用法是什么?
它们的意思相同 - 在两种情况下,类型都将const char*
。但是,使用 auto *
会强调(和自我记录)f()
返回指针的事实。如果稍后将函数更改为返回其他内容(例如 std::string
在这种情况下)。
使用哪个主要是风格问题。如果代码严重依赖f()
返回指针,或者您觉得有必要使其显而易见,请使用 auto*
。否则,只需使用auto
并完成它。
请注意,返回引用时的大小写是不同的。这些被auto
扣除删除,因此如果您需要将返回的引用作为引用,则必须使用auto &
(或使用auto &&
来获取通用引用)。
auto s1 = f();
您可以使用auto
,以便编译器可以随时推断出适当的类型,而无需自己这样做。 不管它是否是指针,因为它是类型的一部分,所以你不必担心。
auto
为您完成任何类型的类型,如果您指定了指针( *
) 它剩下的就是完成char
(或者如果没有可用的补全会导致错误,例如,如果f()
返回一个普通char
)。
你应该打扰指针,只需使用auto
.
相关文章:
- 为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- 为什么 std::gcd/lcm 返回 std::common_type_t<M, N> 而不是 auto?
- 使用constexpr + auto作为返回和参数类型的奇怪类型推导
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- decltype(auto) 是否使尾随返回类型过时?
- 用 decltype 和 auto 推导出 const(返回)类型
- 返回"auto"的函数在定义之前不能使用
- 警告:函数使用不带尾随返回类型的'auto'类型说明符
- 提示编译器在使用 auto 时通过引用返回,而不使用 ->
- 使用auto&&完美转发返回值
- decltype(auto) 类型演绎:返回 x 与返回 (x)
- 如何验证返回的“auto”变量是否为引用
- C++:在原型中声明"auto"函数返回类型仍然会导致在扣除错误之前使用"auto&quo
- 从函数返回引用是否会导致在使用'auto'时创建新的临时对象?
- C++14 'auto'能够获取函数返回类型,我们还需要 std::result_of<> 吗?
- 如何在编译时决定'auto'返回类型?
- 使用 auto 返回不同的 lambda
- C++11 中的 decltype(auto) - 推断返回类型
- 基类的返回类型与使用 auto 的派生类冲突