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

Hen*_*ker 51 c++ variable-declaration auto c++11

bar1和和的类型有什么区别bar2

int foo = 10;
auto bar1 = &foo;
auto *bar2 = &foo;
Run Code Online (Sandbox Code Playgroud)

如果这两个bar1bar2int*,确实是有意义的写指针声明符(*)在bar2声明?

Vic*_*nko 53

使用auto *"文件意图".并且auto *p = expr;只有expr返回指针才能正确推导出.例:

int f();

auto q = f(); // OK

auto *p = f(); // error: unable to deduce 'auto*' from 'f()'
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是下一个运算符&被重载以返回notnull或const传播智能指针,然后自动*中断. (3认同)

vso*_*tco 48

声明完全相同.auto模板类型推导相同(几乎)相同.明确地放置星形使代码更容易阅读,并使程序员意识到这bar2是一个指针.


Som*_*ken 14

在这个具体的例子都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;
}
Run Code Online (Sandbox Code Playgroud)


dan*_*pla 14

使用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
Run Code Online (Sandbox Code Playgroud)


Jef*_*wab 10

正如其他人所说,他们将生成相同的代码.星号是线路噪声(例如,如果&foo被替换为原始指针,则更难以从原始指针切换到智能指针get_foo()).如果你想要明确,那么一定要明确; 但是当你使用类型推断时,只需让编译器完成它的工作.缺少星号并不意味着对象不是指针.

  • 我认为括号中的评论应该得到更多的重视.即使在其他人给出的简单示例中,添加"*"可能会使代码更具可读性,但可能会使维护更加困难.我个人觉得`auto`的主要好处是简化维护,甚至比减少打字或提高可读性更重要. (3认同)

Ker*_* SB 7

就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;
 }
Run Code Online (Sandbox Code Playgroud)

并且不要说:

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
Run Code Online (Sandbox Code Playgroud)

另请注意,引用限定符(与指针不同)真正更改了声明的变量的类型,因此它们不是可选的:

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

最后,添加显式const指针限定可以帮助const正确性.考虑下一个示例,其中容器包含指向可变的指针,但我们只需要const访问权限.只是auto *推断出一个指向mutable的指针,我们可以通过const明确说明来避免:

std::vector<X*> v = /* ... */;
for (const auto * p : v)
{
    observe(p->foo());   // no need for a mutable *p
}
Run Code Online (Sandbox Code Playgroud)