auto a = (Foo<T>*)malloc(sizeof(Foo<T>));
auto *b = (Foo<T>*)malloc(sizeof(Foo<T>));
我认为模板不存在很重要,但问题是:a
和b
属于同一类型吗?
g++ -std=c++0x -Wall
(4.4)没有提供任何错误或警告,但我没有运行程序,所以我不知道它是否做同样的事情。
这是否意味着对于a
,auto
为Foo<T>*
,但对于b
,auto
为Foo<T>
?
答案 0 :(得分:12)
是同一类型的
a
和b
吗?
让我们找出来,好吗?
#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
这样编译时没有静态断言失败。
这是否意味着对于
a
,auto
为Foo<T>*
,但对于b
,auto
为Foo<T>
?
是
答案 1 :(得分:2)
您可以将auto
视为占位符。在您的示例中,a
和b
的声明类型相同。唯一的区别是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
}
除了这种特殊情况,扣除规则是相同的。