c ++ 11中'auto'类型的指针类型是否需要'*'?

Dol*_*cci 44 c++ pointers auto c++11

鉴于我的变量是一个指针,如果我将它分配给"auto"类型的变量,我是否指定"*"?

std::vector<MyClass> *getVector(); //returns populated vector
//...

std::vector<MyClass> *myvector = getVector();  //assume has n items in it
auto newvar1 = myvector;

// vs:
auto *newvar2 = myvector;

//goal is to behave like this assignment:
std::vector<MyClass> *newvar3 = getVector();
Run Code Online (Sandbox Code Playgroud)

我对autoc ++ 11的工作方式有点困惑(这是c ++ 11的新功能,对吧?)

更新:我修改了上面的内容,以更好地阐明我的向量是如何在函数中填充的,我只是尝试将返回的指针赋给变量.对困惑感到抱歉

jpa*_*cek 46

auto newvar1 = myvector;

// vs:
auto *newvar2 = myvector;
Run Code Online (Sandbox Code Playgroud)

这两个都是相同的,并将声明一个指针 std::vector<MyClass> (指向随机位置,因为myvector在您的示例中未初始化并且可能包含垃圾).所以基本上你可以使用它们中的任何一个.我更喜欢auto var = getVector(),但你可以选择,auto* var = getVector()如果你认为它var更好地强调意图(这是一个指针).

我必须说我从未梦想过使用类似的不确定性auto.我认为人们只会使用auto而不是考虑它,这在99%的时间都是正确的 - auto用东西装饰的需要只有引用和cv限定符.

然而,就是在两者之间细微的差别时略有修改:

auto newvar1 = myvector, newvar2 = something;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,newvar2将是一个指针(也必须是一些东西).

auto *newvar1 = myvector, newvar2 = something;
Run Code Online (Sandbox Code Playgroud)

这里newvar2是指针类型,例如.std::vector<MyClass>,初始化程序必须足够.

通常,如果初始化程序不是支撑的初始化程序列表,则编译器处理auto如下:

  1. 它生成一个人工函数模板声明,其中一个参数具有声明符的确切形式,auto并由模板参数替换.因此auto* x = ...,它使用

    template <class T> void foo(T*);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 它尝试解析调用foo(initializer),并查看推断出的内容T.这取代了代替auto.

  3. 如果单个声明中有更多声明符,则对所有声明都执行此操作.推导出T的所有人都必须相同......

  • @ildjarn经验证据似乎不同意你的意见.我在Clang 3.4和gcc 4.8.3上得到了相同的结果.此外,它遵循模板类型推导:如果主模板推导出`T = int*`,那么指针的特化将推导出`T = int`.对于`auto*p =&i;`,推导出的`int`类型然后用'auto*'的指针声明器部分'增强',产生与`auto p =&i`中相同的类型. (2认同)

Pib*_*ben 5

常量性之间autoauto*常量性之间存在细微的差异。

int i;
const auto* p = &i;
Run Code Online (Sandbox Code Playgroud)

相当于

int i;
const int* p = &i;
Run Code Online (Sandbox Code Playgroud)

int i;
const auto p = &i;
Run Code Online (Sandbox Code Playgroud)

相当于

int i;
const int* const p = &i;
Run Code Online (Sandbox Code Playgroud)

这具有以下效果:

int i;
const auto* p = &i;
Run Code Online (Sandbox Code Playgroud)

  • `const auto p = &amp;i` 相当于 `int* const`,而不是 `const int* const`。在您的示例中,可以执行“*p2 = 7;”。 (2认同)