带有和不带有指针d的C ++ 11自动声明

bar1bar2的类型有什么区别?

int foo = 10;
auto bar1 = &foo;
auto *bar2 = &foo;

如果2715781628828848243712和bar2都是int*,在bar2声明中写入指针声明符(*)是否有意义?

Henry Barker asked 2020-01-23T20:21:49Z
6个解决方案
52 votes

使用auto *“文档意图”。 仅当expr返回指针时,才能正确推断auto *p = expr;。 例:

int f();

auto q = f(); // OK

auto *p = f(); // error: unable to deduce 'auto*' from 'f()'
Victor Dyachenko answered 2020-01-23T20:22:30Z
47 votes

声明是完全等效的。 auto的工作原理(几乎)与模板类型推论相同。 明确地加星号使代码更易于阅读,并使程序员意识到bar2是指针。

vsoftco answered 2020-01-23T20:22:10Z
14 votes

在此特定示例中,bar1bar2是相同的。 虽然我会说bar2更容易阅读,但这是个人喜好问题。

但是,对于在本示例中看到的引用,这并不成立:

#include <iostream>
using namespace std;

int main() {
    int k = 10;
    int& foo = k;
    auto bar = foo; //value of foo is copied and loses reference qualifier!
    bar = 5; //foo / k won't be 5
    cout << "bar : " << bar << " foo : " << foo << " k : " << k << endl;
    auto& ref = foo;
    ref = 5; // foo / k will be 5
    cout << "bar : " << bar << " foo : " << foo << " k : " << k;
    return 0;
}
Sombrero Chicken answered 2020-01-23T20:22:55Z
14 votes

使用const限定词有很大的不同:

int i;

// Const pointer to non-const int
const auto ip1 = &i; // int *const
++ip1; // error
*ip1 = 1; // OK

// Non-const pointer to const int
const auto* ip2 = &i; // int const*
++ip2; // OK
*ip2 = 1; // error
danpla answered 2020-01-23T20:23:15Z
10 votes

正如其他人所说,他们将生成相同的代码。 星号是线路噪声(例如,如果&fooget_foo()取代,则很难从原始指针切换到智能指针)。 如果你想明确,那么一定要明确。 但是当您使用类型推断时,只需让编译器完成其工作即可。 缺少星号并不表示对象不是指针。

Jeff Schwab answered 2020-01-23T20:23:35Z
7 votes

就C ++代码的解释而言,这无关紧要。 你可以写任何你想要的。 但是,存在一个样式和可读性的问题:通常,您不应该在类型别名中隐藏指针,引用和CV限定词,甚至可能隐藏智能指针,因为这会使读者更难以理解正在发生的事情。 类型别名应打包语义相关的类型内容,而限定符和修饰符应保持可见。 因此,首选以下内容:

 using Foo = long_namespace::Foobrigation<other_namespace::Thing>;
 using MyFn = const X * (int, int);

 std::unique_ptr<Foo> MakeThatThing(MyFn & fn, int x)   // or "MyFn * fn"
 { 
     const auto * p = fn(x, -x);
     return p ? p->Create() : nullptr;
 }

而且不要说:

using PFoo = std::unique_ptr<Foo>;   // just spell it out
using MyFn = int(&)(int, int);       // unnecessary; & is easy to spell
auto p = fn(x, -x);                  // Don't know that p is a pointer

还要注意,引用限定符(与指针不同)确实会更改要声明的变量的类型,因此它们不是可选的:

X & f();
auto a = f();    // copy!
auto & b = f();  // b is the same as the return value of f()

最后,添加显式const指针限定条件可以帮助const正确性。 考虑下一个示例,其中的容器包含指向可变变量的指针,但是我们只需要const访问。 仅auto *会得出一个指向可变的指针,我们可以通过明确地说const来避免这种情况:

std::vector<X*> v = /* ... */;
for (const auto * p : v)
{
    observe(p->foo());   // no need for a mutable *p
}
Kerrek SB answered 2020-01-23T20:24:10Z
translate from https://stackoverflow.com:/questions/34560365/c11-auto-declaration-with-and-without-pointer-declarator