Значение C ++ 0x авто-ключевое слово, например? - PullRequest
3 голосов
/ 24 сентября 2010
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>?

Ответы [ 2 ]

12 голосов
/ 24 сентября 2010

являются 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>?

Да.

2 голосов
/ 24 сентября 2010

Вы можете думать о 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
}

Помимо этого особого случая, правила удержания одинаковы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...