例如,C ++ 0x auto关键字的含义是什么?

时间:2010-09-24 06:46:27

标签: c++ gcc c++11

auto a = (Foo<T>*)malloc(sizeof(Foo<T>));
auto *b = (Foo<T>*)malloc(sizeof(Foo<T>));

我认为模板不存在很重要,但问题是:ab属于同一类型吗?

g++ -std=c++0x -Wall(4.4)没有提供任何错误或警告,但我没有运行程序,所以我不知道它是否做同样的事情。

这是否意味着对于aautoFoo<T>*,但对于bautoFoo<T>

2 个答案:

答案 0 :(得分:12)

  

是同一类型的ab吗?

让我们找出来,好吗?

#include <cstdlib>
#include <type_traits>

template <typename T>
struct Foo
{
    T member;
};

template <typename T>
void test()
{
    auto  a = (Foo<T>*)malloc(sizeof(Foo<T>));
    auto *b = (Foo<T>*)malloc(sizeof(Foo<T>));

    static_assert(std::is_same<decltype(a), decltype(b)>::value, "same type");
}

template void test<int>();   // explicit instantiation

这样编译时没有静态断言失败。

  

这是否意味着对于aautoFoo<T>*,但对于bautoFoo<T>

答案 1 :(得分:2)

您可以将auto视为占位符。在您的示例中,ab的声明类型相同。唯一的区别是auto在第一种情况下推断为指针本身,而在第二种情况下推断它只是Foo<T>

除了一个特殊情况,auto就像模板参数推导一样使用函数:

template<class U>
void func_a(U);

template<class U>
void func_b(U*);

template<class T> struct Foo {};

template<class T>
void test() {
   func_a( new Foo<T> ); // U = Foo<T>*
   func_b( new Foo<T> ); // U = Foo<T>
}

在您的示例中,推导auto就像上面代码中的类型参数U一样。

我所说的特殊情况是初始化列表:

void test2() {
    auto x = {1,2,3};  // OK, decltype(x) --> initializer_list<int>
    func_a( {1,2,3} ); // Illegal, U cannot be deduced because
                       // {1,2,3} is not considered an expression
}

除了这种特殊情况,扣除规则是相同的。