Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели на неименованные перечисления, где-нибудь использует или для "красоты" 
V
    Опции темы
null56
Дата 1.3.2012, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



Всем привет

сейчас перечитываю книжку Вандервуда по шаблонам с++ и увидел одну непривычную для себя инструкцию
http://reslib.com/book/Shabloni_S____Sprav...zrabotchika#132

указатель на неименованное перечисление ColorPtr

Вопрос: что можно сделать с переменной такого типа, кроме как присвоить ей значение NULL
Код

   typedef enum { one, two } * T;
   T a = NULL; // и всё?


Ну и тогда побочный вопрос, уже по книге, с той же страницы куда и ссылка
Автор пишет, что нельзя использовать в качестве аргументов шаблона неименованное перечисление, только когда они определены с помощью typedef. В приведенном в книге примере используется typedef, но всё равно автор пишет, что это ошибка...
Чему верить?

заранее благодарен всем откликнувшимся
PM MAIL   Вверх
borisbn
Дата 1.3.2012, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(null56 @  1.3.2012,  14:18 Найти цитируемый пост)
 что можно сделать с переменной такого типа, кроме как присвоить ей значение NULL

выделить под неё память с помощью new, но такииииииим извращенским способом...
Код

template< class T >
struct S {
    T x;
};

typedef enum { one, two } *E;
S< E > s_e;

int main()
{
    E ptr;
    s_e.x = new typename std::remove_reference< decltype( *ptr ) >::type;
    *s_e.x = one; // кстати, прикольное имя получилось :)
    if ( *s_e.x == one ) {
        std::cout << "one";
    }
    else {
        std::cout << "more then one";
    }
}

http://liveworkspace.org/code/7c03a8e84e25...150ce02c51f0c9c



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 1.3.2012, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(borisbn @  1.3.2012,  16:22 Найти цитируемый пост)
// кстати, прикольное имя получилось smile

это лучшая строка в коде smile 
PM WWW   Вверх
baldina
Дата 1.3.2012, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(null56 @  1.3.2012,  14:18 Найти цитируемый пост)
Вопрос: что можно сделать с переменной такого типа, кроме как присвоить ей значение NULL

в современном С++ кое-что можно
http://liveworkspace.org/code/69321f31f4b2...c0a66426c614108

Добавлено через 14 минут и 26 секунд
borisbn, а почему не написать просто
Код

typedef typename std::remove_reference< decltype(*E()) >::type enum_type;

PM MAIL   Вверх
borisbn
Дата 1.3.2012, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(baldina @  1.3.2012,  16:55 Найти цитируемый пост)
borisbn, а почему не написать просто

честно говоря, что то, что это выглядит паршиво. согласны ?
а вот про такую конструкцию
Цитата
new auto(a)

не знал. век живи... как говорится))


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
null56
Дата 1.3.2012, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



отличные ответы, спасибо
PM MAIL   Вверх
boostcoder
Дата 1.3.2012, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата

new auto(a)

кто-нибудь, объясните, как это работает.
я представляю то вместо auto тут должен быть decltype():
Цитата

new decltype(a)(a);

http://liveworkspace.org/code/9f1050e8f6d4...dc87286e11985cd

Это сообщение отредактировал(а) boostcoder - 1.3.2012, 20:22
PM WWW   Вверх
k0rvin
Дата 1.3.2012, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(boostcoder @ 1.3.2012,  19:44)
Код

ab_ptr_type a_ptr = new auto(a);

кто-нибудь, объясните, как это работает.

Элементарно:
тип a_ptr -- ab_ptr_type
ab_ptr_type -- указатель на элемент перечисления {a, b}
=> new auto(a) -- указатель на динамически созданное значение a из того перечисления.

Обычный вывод типов, хотя тут выглядит как магия.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 1.3.2012, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(k0rvin @  1.3.2012,  21:56 Найти цитируемый пост)
Обычный вывод типов, хотя тут выглядит как магия.

для этого был создан decltype. а auto - тут как-то необычно смотрится..
PM WWW   Вверх
k0rvin
Дата 1.3.2012, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(boostcoder @ 1.3.2012,  22:19)
Цитата(k0rvin @  1.3.2012,  21:56 Найти цитируемый пост)
Обычный вывод типов, хотя тут выглядит как магия.

для этого был создан decltype. а auto - тут как-то необычно смотрится..

decltype для вывода типов? auto тут вполне логично смотрится.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
borisbn
Дата 2.3.2012, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(k0rvin @  1.3.2012,  21:56 Найти цитируемый пост)
Элементарно:
тип a_ptr -- ab_ptr_type
ab_ptr_type -- указатель на элемент перечисления {a, b}
=> new auto(a) -- указатель на динамически созданное значение a из того перечисления.

а как тогда это работает ?
Код
typedef enum { a, b } *ab_ptr_type;
int main () {
   auto a_ptr = new auto(a);
   auto b_ptr = new auto(b);
   std::cout << *a_ptr << std::endl << *b_ptr;
}

http://liveworkspace.org/code/f17ca1e0ea03...9b0adeb80c7e800

Цитата(k0rvin @  1.3.2012,  22:34 Найти цитируемый пост)
decltype для вывода типов?

ну, вообще-то, да.

Это сообщение отредактировал(а) borisbn - 2.3.2012, 12:44


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 2.3.2012, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(borisbn @  2.3.2012,  12:44 Найти цитируемый пост)
ну, вообще-то, да.

я решил не отвечать на это.
PM WWW   Вверх
k0rvin
Дата 2.3.2012, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(borisbn @ 2.3.2012,  12:44)
Цитата(k0rvin @  1.3.2012,  21:56 Найти цитируемый пост)
Элементарно:
тип a_ptr -- ab_ptr_type
ab_ptr_type -- указатель на элемент перечисления {a, b}
=> new auto(a) -- указатель на динамически созданное значение a из того перечисления.

а как тогда это работает ?
Код
typedef enum { a, b } *ab_ptr_type;
int main () {
   auto a_ptr = new auto(a);
   auto b_ptr = new auto(b);
   std::cout << *a_ptr << std::endl << *b_ptr;
}

Точно также, только, поскольку тип слева неизвестен, то он выводится из выражения справа, в котором известен тип a - enum{a,b}

Добавлено через 5 минут и 41 секунду
Цитата(borisbn @ 2.3.2012,  12:44)
ну, вообще-то, да.

Судя по описанию в вике, вообще-то нет.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
borisbn
Дата 2.3.2012, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(k0rvin @  2.3.2012,  15:31 Найти цитируемый пост)
Судя по описанию в вике, вообще-то нет. 

Цитата(wiki)
 decltype is an operator for querying the type of an expression

Почему нет-то ? "Вывод" типа или "запрос" типа - ИМХО разные названия одного и того же.
И почему тогда такая конструкция не работает
Код
auto a_value = auto( a );

а такая - работает
Код
auto a_value = decltype( a )( a );


нет... что-то в этом new auto не так...


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
k0rvin
Дата 4.3.2012, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(borisbn @ 2.3.2012,  16:27)
Почему нет-то ? "Вывод" типа или "запрос" типа - ИМХО разные названия одного и того же.

Потому что "вывод типа" и "запрос типа (у выражения)" -- принципиально разные вещи. Decltype берет тип от выражения, тип которого уже известен (задекларирован). auto же вычисляет тип выражения, тип которого, заранее неизвестен.

Добавлено @ 14:55
Цитата(borisbn @ 2.3.2012,  16:27)
И почему тогда такая конструкция не работает
Код
auto a_value = auto( a );

Почему не работает? Ты же выше приводил код, где работает.

Это сообщение отредактировал(а) k0rvin - 4.3.2012, 14:55


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 4.3.2012, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(k0rvin @  4.3.2012,  14:53 Найти цитируемый пост)
auto же вычисляет тип выражения, тип которого, заранее неизвестен.

неправда smile

PM WWW   Вверх
k0rvin
Дата 4.3.2012, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(boostcoder @ 4.3.2012,  15:06)
неправда smile

истинная правда.

Добавлено через 37 секунд
Ну разве что точнее "заранее неопределен"


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 4.3.2012, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(k0rvin @  4.3.2012,  15:25 Найти цитируемый пост)
истинная правда.

постыдились бы.

auto, компилятор разворачивает как:
Код

auto i = expr;
// ->
decltype(expr) i = expr;


Добавлено через 1 минуту и 12 секунд
Цитата(k0rvin @  4.3.2012,  14:53 Найти цитируемый пост)
auto же вычисляет тип выражения, тип которого, заранее неизвестен.

это возможно только в ран-тайме. а с++ - не динамический язык.
PM WWW   Вверх
k0rvin
Дата 4.3.2012, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(boostcoder @ 4.3.2012,  15:30)
Цитата(k0rvin @  4.3.2012,  15:25 Найти цитируемый пост)
истинная правда.

постыдились бы.

auto, компилятор разворачивает как:
Код

auto i = expr;
// ->
decltype(expr) i = expr;


Добавлено @ 15:32
Цитата(k0rvin @  4.3.2012,  14:53 Найти цитируемый пост)
auto же вычисляет тип выражения, тип которого, заранее неизвестен.

это возможно только в ран-тайме. а с++ - не динамический язык.

"постыдились бы"

http://en.wikipedia.org/wiki/Type_inference
http://en.wikipedia.org/wiki/C%2B%2B11#Type_inference

И никакой динамической типизации.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 4.3.2012, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(k0rvin @  4.3.2012,  16:50 Найти цитируемый пост)
http://en.wikipedia.org/wiki/C%2B%2B11#Type_inference

так сами и прочтите о чем там пишут.

Это сообщение отредактировал(а) boostcoder - 4.3.2012, 17:20
PM WWW   Вверх
k0rvin
Дата 4.3.2012, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(boostcoder @ 4.3.2012,  17:19)
Цитата(k0rvin @  4.3.2012,  16:50 Найти цитируемый пост)
http://en.wikipedia.org/wiki/C%2B%2B11#Type_inference

так сами и прочтите о чем там пишут.

Я-то прочел, а ты?

Добавлено через 5 минут и 21 секунду
Рекомендую для понимания обратить внимание на этот пример:
Цитата

The type denoted by decltype can be different from the type deduced by auto.
Код

#include <vector>
int main()
{
    const std::vector<int> v(1);
    auto a = v[0];        // a has type int
    decltype(v[0]) b = 1; // b has type const int&, the return type of
                        // std::vector<int>::operator[](size_type) const
    auto c = 0;           // c has type int
    auto d = c;           // d has type int
    decltype(c) e;        // e has type int, the type of the entity named by c
    decltype((c)) f = c;  // f has type int&, because (c) is an lvalue
    decltype(0) g;        // g has type int, because 0 is an rvalue
}




--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 4.3.2012, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



если Вы прочли, то что же Вы этим сказать хотели?:
Цитата(k0rvin @  1.3.2012,  22:34 Найти цитируемый пост)
decltype для вывода типов?


или Вы просто троллите?

PM WWW   Вверх
k0rvin
Дата 4.3.2012, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(boostcoder @ 4.3.2012,  17:38)
если Вы прочли, то что же Вы этим сказать хотели?:
Цитата(k0rvin @  1.3.2012,  22:34 Найти цитируемый пост)
decltype для вывода типов?


или Вы просто троллите?

Я этим задал вопрос (знак вопроса '?' как бы говорит нам об этом). В вопросе содержался намек, что decltype — это не вывод типов, чтобы автор поста про decltype задумался.

Это сообщение отредактировал(а) k0rvin - 4.3.2012, 17:43


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 4.3.2012, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(k0rvin @  4.3.2012,  17:41 Найти цитируемый пост)
decltype — это не вывод типов

а что же это?
PM WWW   Вверх
volatile
Дата 4.3.2012, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(k0rvin @  4.3.2012,  17:21 Найти цитируемый пост)
#include <vector>
    const std::vector<int> v(1);
    auto a = v[0];        // a has type int
    decltype(v[0]) b = 1; // b has type const int&, the return type of
                        // std::vector<int>::operator[](size_type) const
    auto c = 0;           // c has type int
    auto d = c;           // d has type int
    decltype© e;        // e has type int, the type of the entity named by c
    decltype(©) f = c;  // f has type int&, because © is an lvalue
    decltype(0) g;        // g has type int, because 0 is an rvalue
}

k0rvin, в какой строчке тип заранее не известен?

Цитата(k0rvin @  4.3.2012,  14:53 Найти цитируемый пост)
auto же вычисляет тип выражения, тип которого, заранее неизвестен.

В С/С++ впринципе это невозможно. Просто по определению  smile 
С/С++ язык со статической типизацией - и этим все сказано.
PM MAIL   Вверх
boostcoder
Дата 4.3.2012, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



http://stackoverflow.com/questions/6869888...to-and-decltype

или я "таво", или второе...

Добавлено через 1 минуту и 38 секунд
Цитата(volatile @  4.3.2012,  17:49 Найти цитируемый пост)
В С/С++ впринципе это невозможно. Просто по определению   
С/С++ язык со статической типизацией - и этим все сказано.

я тоже пытался обратить его внимание на это. но после ответа, я уже начал сомневаться в себе smile 
PM WWW   Вверх
k0rvin
Дата 4.3.2012, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(volatile @ 4.3.2012,  17:49)
Цитата(k0rvin @  4.3.2012,  14:53 Найти цитируемый пост)
auto же вычисляет тип выражения, тип которого, заранее неизвестен.

В С/С++ впринципе это невозможно. Просто по определению  smile 
С/С++ язык со статической типизацией - и этим все сказано.

Ты ведь не прочитал, что такое "Вывод типов", да? Хаскелл, *ML — тоже языки со статической типизацией.

Добавлено через 1 минуту и 46 секунд
Цитата(boostcoder @ 4.3.2012,  17:51)
я тоже пытался обратить его внимание на это. но после ответа, я уже начал сомневаться в себе smile

И тебе: вывод типов — это техника для статически типизированного языка

Добавлено через 2 минуты и 39 секунд
Цитата(boostcoder @ 4.3.2012,  17:51)
http://stackoverflow.com/questions/6869888...to-and-decltype

т.е. ты не видишь разницу между decltype и auto?


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
volatile
Дата 4.3.2012, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



k0rvin, просто у auto и decltype разная семантика.
auto чудес не совершает.
В любом месте где стоит ауто, компилер точно знает какой именно тип туда нужно поставить.
Причем знает это он в момент компиляции.


PM MAIL   Вверх
k0rvin
Дата 4.3.2012, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(volatile @ 4.3.2012,  17:49)
Цитата(k0rvin @  4.3.2012,  17:21 Найти цитируемый пост)
#include <vector>
    const std::vector<int> v(1);
    auto a = v[0];        // a has type int
    decltype(v[0]) b = 1; // b has type const int&, the return type of

k0rvin, в какой строчке тип заранее не известен?

Тип переменной a заранее не известен, он вычисляется из определения a = v[0]:
Код

const std::vector<int> v(1);
    auto a = v[0];
--
    auto a = <Vector<int>>[0]; // операция [] имеет тип что-то вроде "A (C<A>)", отсюда компилятор, применяя [] к типу Vector<int> (в качестве C<A>) выводит тип a как int.

Зато тип b вычисляется из заранее типизированного выражения, decltype без всяких махинаций берет тип выражения v[0] и приписывает его переменной v.
Т.е. суть в том, что тип переменной a определяется из выражения справа, а тип переменной b из выражения слева (decltype).
Например, если изменить код примерно так:
Код

String foo (int x) {
    return IntToString(x);
}

const std::vector<int> v(1);
    auto a = foo(v[0]);        // a has type int
    decltype(v[0]) b = foo(1); // b has type const int&, the return type of

то a определится как String и вообще строка с определением a будет работать, а стрка с определением b -- нет.

Добавлено через 49 секунд
Цитата(volatile @ 4.3.2012,  18:07)
k0rvin, просто у auto и decltype разная семантика.

Хвала яйцам, кто-то это понял наконец-то.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 4.3.2012, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(k0rvin @  4.3.2012,  17:55 Найти цитируемый пост)
ты не видишь разницу между decltype и auto?

без decltype не существовало бы auto. auto реализован "поверх" decltype, с немного другой семантикой. но вывод типов - это decltype.

PM WWW   Вверх
k0rvin
Дата 4.3.2012, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(volatile @ 4.3.2012,  18:07)
В любом месте где стоит ауто, компилер точно знает какой именно тип туда нужно поставить.
Причем знает это он в момент компиляции.

Да, но он вычисляет (выводит) его (тип) из выражения справа например. Это позволяет не менять часть кода, типы которого зависят от других типов и их сложно определить однозначно. + уменьшает количество синтаксического мусора.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 4.3.2012, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(k0rvin @  4.3.2012,  18:08 Найти цитируемый пост)
Хвала яйцам, кто-то это понял наконец-то.

т.е. ты целую страницу разводил демагогию из-за того что auto несколько изменяет семантику decltype, и просто ухмылялся что мы "не разглядели моську"?
минусовать тебя за это.

Добавлено @ 18:19
и разумеется ты не видел этого:
Цитата(boostcoder @  4.3.2012,  15:30 Найти цитируемый пост)
auto i = expr;
// ->
decltype(expr) i = expr;



Это сообщение отредактировал(а) boostcoder - 4.3.2012, 18:26
PM WWW   Вверх
volatile
Дата 4.3.2012, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(k0rvin @ 4.3.2012,  18:08)
Цитата(volatile @ 4.3.2012,  18:07)
k0rvin, просто у auto и decltype разная семантика.

Хвала яйцам, кто-то это понял наконец-то.

k0rvin, ну так и нужно было говорить именно так, согласитесь что:
Цитата(k0rvin @  4.3.2012,  14:53 Найти цитируемый пост)
auto же вычисляет тип выражения, тип которого, заранее неизвестен.

не совсем то, с чем можно согласиться...  smile 
PM MAIL   Вверх
k0rvin
Дата 4.3.2012, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(boostcoder @ 4.3.2012,  18:11)
без decltype не существовало бы auto. auto реализован "поверх" decltype, с немного другой семантикой. но вывод типов - это decltype.

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


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 4.3.2012, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(k0rvin @  4.3.2012,  18:27 Найти цитируемый пост)
Decltype требует явного указания выражения, от которого брать тип.

повторю в третий раз:
Цитата(boostcoder @  4.3.2012,  18:18 Найти цитируемый пост)
auto i = expr;
// ->
decltype(expr) i = expr;


PM WWW   Вверх
k0rvin
Дата 4.3.2012, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(boostcoder @ 4.3.2012,  18:18)
Цитата(k0rvin @  4.3.2012,  18:08 Найти цитируемый пост)
Хвала яйцам, кто-то это понял наконец-то.

т.е. ты целую страницу разводил демагогию из-за того что auto несколько изменяет семантику decltype, и просто ухмылялся что мы "не разглядели моську"?
минусовать тебя за это.

Добавлено @ 18:19
и разумеется ты не видел этого:
Цитата(boostcoder @  4.3.2012,  15:30 Найти цитируемый пост)
auto i = expr;
// ->
decltype(expr) i = expr;

Мда. Еще недавно ты не понимал как работает код на первой странице...
Рекомендую переделать следующий код, чтобы он был без auto, и подумать, что будет с кодом проекта, порядка так 100к строк от подобной переделки.
Код

#include <iostream>

template<typename T>
T add (T x, T y) {
    return x + y;
}

int main () {
    auto x = add<int>(1, 2);
    std::cout << x << std::endl;
    return 0;
}


Добавлено @ 18:49
Цитата(boostcoder @ 4.3.2012,  18:31)
Цитата(k0rvin @  4.3.2012,  18:27 Найти цитируемый пост)
Decltype требует явного указания выражения, от которого брать тип.

повторю в третий раз:
Цитата(boostcoder @  4.3.2012,  18:18 Найти цитируемый пост)
auto i = expr;
// ->
decltype(expr) i = expr;

Это и есть явное указание выражения. Так что ты сказать хотел?

Это сообщение отредактировал(а) k0rvin - 4.3.2012, 18:50


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 4.3.2012, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(k0rvin @  4.3.2012,  18:48 Найти цитируемый пост)
Это и есть явное указание выражения.

так вот компилятор делает тоже самое. неявно. я об этом в самом начале написал. специально для тебя объяснил это. чтоб исключить недопонимание.
user posted image
ты в танке?


Это сообщение отредактировал(а) boostcoder - 4.3.2012, 18:59
PM WWW   Вверх
mes
Дата 4.3.2012, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



boostcoder, если быть точным, то не разворачивает.. auto и decltype реализуются дополняя друг друга , а не одно над другим..

Добавлено через 1 минуту и 57 секунд
если взять ваш пример то
 
Цитата(k0rvin @  4.3.2012,  17:48 Найти цитируемый пост)
auto i = expr;
// ->
decltype(expr) i = expr;

то по сути правильно :
Код


auto i = expr;
// ->
auto i = expr -> decltype(expr);


Добавлено через 3 минуты и 52 секунды
при том на новом стиле записи функций это явно проступает
Код

auto f () ->decltype(..)


Добавлено через 5 минут и 22 секунды
т.е. auto и decltype два рычага одного механизма, а не один и тот же рычаг под разным соусом smile



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.3.2012, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes, называйте как угодно.
цель одна?
auto выводит тип?

Добавлено через 5 минут и 15 секунд
Цитата(mes @  4.3.2012,  20:17 Найти цитируемый пост)
то по сути правильно

нет. auto у нас нет. есть decltype и обертка над ним с несколько иной семантикой, реализующая auto.

зы
залезу я все же на stackoverflow...
PM WWW   Вверх
mes
Дата 4.3.2012, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  4.3.2012,  19:41 Найти цитируемый пост)
auto выводит тип?

нет, она говорит что для этого выражения тип будет определен позже smile
"позже" это не рантайм )) 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.3.2012, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  4.3.2012,  21:14 Найти цитируемый пост)
нет, она говорит что для этого выражения тип будет определен позже

ок.

тогда, какую же роль выполняет auto в этом примере, и справедлив ли предполагаемый мной разворот auto?:
Цитата(mes @  4.3.2012,  20:17 Найти цитируемый пост)
auto i = expr;
// ->
decltype(expr) i = expr;


и, что же на самом деле, означает выражение?:
Код

auto a_ptr = new auto(a);

PM WWW   Вверх
mes
Дата 4.3.2012, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



разница хороша видна на примере std::vector<auto> = f ();
куда засунуть тут declexpr ?





--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.3.2012, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  4.3.2012,  21:21 Найти цитируемый пост)
std::vector<auto> = f ();

а этот код разве должен компилится?
http://liveworkspace.org/code/fa66874e2d85...5d7ae138ce15e71
PM WWW   Вверх
mes
Дата 4.3.2012, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  4.3.2012,  20:19 Найти цитируемый пост)
, и справедлив ли предполагаемый мной разворот auto?:

не совсем, ибо упускается из виду важный механизм о котором и говорил korvin.. умение определять тип , по выражению , которое определится позже.. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.3.2012, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



зато с decltype все в порядке: http://liveworkspace.org/code/81fea29a4f58...a1711b4de18e78e
PM WWW   Вверх
mes
Дата 4.3.2012, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  4.3.2012,  20:23 Найти цитируемый пост)
а этот код разве должен компилится?

должен (естественно f возвращает вектор, но не значение ), но увы не компилится.. будем ждать ))



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.3.2012, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  4.3.2012,  21:24 Найти цитируемый пост)
которое определится позже

оно не позже определяется. это компилятор вместо auto вставляет decltype с несколько иной семантикой, именно для подобных случаев. ИМХО.
но я все равно завтра поспрашиваю на stackoverflow.

Добавлено @ 21:28
Цитата(mes @  4.3.2012,  21:27 Найти цитируемый пост)
естественно f возвращает вектор, но не значение

покажите, что конкретно Вы имеете ввиду?

Это сообщение отредактировал(а) boostcoder - 4.3.2012, 21:31
PM WWW   Вверх
mes
Дата 4.3.2012, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  4.3.2012,  20:25 Найти цитируемый пост)
зато с decltype все в порядке:

это совсем другое..  вот тут примените decltype :
Код


template <typename T>
struct A {};
template <typename T>
A<T> f(T  ) { return A<T> (); } 


int main() {
   A<auto> a =  f (5);
}


Это сообщение отредактировал(а) mes - 4.3.2012, 21:31


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.3.2012, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



а этот код точно корректный?
PM WWW   Вверх
mes
Дата 4.3.2012, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  4.3.2012,  20:27 Найти цитируемый пост)
 это компилятор вместо auto вставляет decltype

еще раз на примере функции : 
auto // нельзя выведать тип результата операции над аргументами,
    f (int i, int j)  //  пока не определены аргументы..
         -> decltype ( i+j)  // а теперь уже можно..
{
}



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.3.2012, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



мне кажется, auto в данном случае просто синтаксический сахар. ибо никакой иной роли оно выполнять не может.
по тому, я и говорю, что auto - это decltype с несколько иной семантикой, именно для подобных случаев.

зы
может я не правильно вопросы задаю...


Это сообщение отредактировал(а) boostcoder - 4.3.2012, 21:37
PM WWW   Вверх
mes
Дата 4.3.2012, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  4.3.2012,  20:36 Найти цитируемый пост)
 это decltype с несколько иной семантикой,

Цитата

? Should auto be defined in terms of decltype (i.e., is auto var = expr equivalent to
decltype(expr) var = expr)? We suggest that the answer to that question be "no" because the semantics would be surprising, non-ideal for the purpose of initializing variables, and incompatible with current uses of typeof. Instead, we
propose that the semantics of auto follow exactly the rules of template argument deduction

http://www.open-std.org/jtc1/sc22/wg21/doc.../2003/n1478.pdf


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.3.2012, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



я понимаю о чем там говорится. но я не понимаю почему..
PM WWW   Вверх
mes
Дата 4.3.2012, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата

A unconditionally reference-preserving auto (e.g. an auto directly based on decltype) would favor an object-oriented
style of use to the detriment of types with value semantics. Basing auto on template argument deduction rules provides
a natural way for a programmer to express his intention. Controlling copying and referencing is essentially the same
as with variables whose types are declared explicitly. 

Цитата

а этот код точно корректный?

Цитата

The type deduction rules extend naturally to more complex definitions:
std::vector<auto> x = foo();
std::pair<auto, auto>& y = bar()


Цитата(boostcoder @  4.3.2012,  20:42 Найти цитируемый пост)
я понимаю о чем там говорится. но я не понимаю почему.. 

boostcoder, говорят что вывод типа и запрос типа имеют разное поведение, а не одно наследует другое.. 



Это сообщение отредактировал(а) mes - 4.3.2012, 21:46


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.3.2012, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Код

std::vector<decltype(foo())> x = foo();
std::pair<decltype(bar()), decltype(bar())>& y = bar()

не?

Добавлено через 1 минуту и 6 секунд
Цитата(mes @  4.3.2012,  21:43 Найти цитируемый пост)
а не одно наследует другое

как по мне, так запрос типа приводит к выводу типа. с несколько иной семантикой.

Добавлено через 2 минуты и 1 секунду
или?:
Код

std::pair<decltype(bar().first), decltype(bar().second)>& y = bar()

PM WWW   Вверх
mes
Дата 4.3.2012, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  4.3.2012,  20:48 Найти цитируемый пост)
не?

отдаленно соостветсвует такая запись :
Код

std::vector<decltype(foo())::value_type> x = foo();

но результат будет разный... 
плюс  наличие value_type может не быть smile

Добавлено через 3 минуты и 19 секунд
Цитата(boostcoder @  4.3.2012,  20:48 Найти цитируемый пост)
или?:

покажите теперь для примера упомянутого выше 
Код

 A<auto> a =  f (5); 



Это сообщение отредактировал(а) mes - 4.3.2012, 21:51


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.3.2012, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  4.3.2012,  21:50 Найти цитируемый пост)
 value_type может не быть

как его может не быть, если функция возвращает вектор?


Код

A<decltype(5)> a =  f (5); 


PM WWW   Вверх
mes
Дата 4.3.2012, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  4.3.2012,  20:59 Найти цитируемый пост)
как его может не быть, если функция возвращает вектор?

а что если кроме вектора ни к кому нельзя подобно применить авто ? см. пример с A smile

Добавлено через 1 минуту и 5 секунд
в случае с A<..> f ()  возвращает А<>.. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.3.2012, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  4.3.2012,  22:01 Найти цитируемый пост)
а что если кроме вектора ни к кому нельзя подобно применить авто ?

опять не понял..

Цитата(mes @  4.3.2012,  22:01 Найти цитируемый пост)
см. пример с A

я же показал как разрулить его.
PM WWW   Вверх
mes
Дата 4.3.2012, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



в случае с A<..> f ()  возвращает А<>.. 

Цитата(boostcoder @  4.3.2012,  21:02 Найти цитируемый пост)
я же показал как разрулить его. 


как минимум, у Вас вместо А<int> будет А<А<int> >...




--------------------
PM MAIL WWW   Вверх
newbee
Дата 4.3.2012, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(boostcoder @  4.3.2012,  23:02 Найти цитируемый пост)
я же показал как разрулить его. 

Код

template<typename T>
struct X{};

X<int> foo(std::string const&);

X<auto> x=foo("Alice Cooper - Hey stupid");


Приведи аналог с decl.

Я сейчас прочитала топик и совсем потеряла веру в бустика. Скажи, зачем хамить и поясничать перед человеком (корвин), который тебе забесплатно объясняет твою неправоту? И минусить в данном случае нужно совсем не его!


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 4.3.2012, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(newbee @  4.3.2012,  22:10 Найти цитируемый пост)
X<auto> x=foo("Alice Cooper - Hey stupid");

хе!
осталось понять, корректен ли этот код..

Цитата(newbee @  4.3.2012,  22:10 Найти цитируемый пост)
потеряла веру в бустика

ньюбка, возможно ты считаешь свою веру эталоном?

Цитата(newbee @  4.3.2012,  22:10 Найти цитируемый пост)
тебе забесплатно объясняет твою неправоту?

чтоб это назвать неправотой, нужно доказать другую правоту. а этого сделано не было. даже mes  не смог.

PM WWW   Вверх
mes
Дата 4.3.2012, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  4.3.2012,  21:17 Найти цитируемый пост)
а этого сделано не было.

пример с A запустите ))  те механизмы, которые вручную придется добавить по дедукции типа и есть отличие auto от decla  smile

Добавлено через 1 минуту и 1 секунду
Цитата(boostcoder @  4.3.2012,  21:17 Найти цитируемый пост)
осталось понять, корректен ли этот код..

по сути да )



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.3.2012, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  4.3.2012,  22:23 Найти цитируемый пост)
пример с A запустите

http://liveworkspace.org/code/c800847632af...cc2efeabb2c6519

Цитата(mes @  4.3.2012,  22:23 Найти цитируемый пост)
те механизмы, которые вручную придется добавить по дедукции типа и есть отличие auto от decla

так а я две страницы что утверждаю?!
 smile

Добавлено через 5 минут и 4 секунды
сто процентное отличие auto от decltype, проявляется только в примере ньюби.
PM WWW   Вверх
mes
Дата 4.3.2012, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  4.3.2012,  21:30 Найти цитируемый пост)
http://liveworkspace.org/code/c800847632af...cc2efeabb2c6519

хмм.. это вы уже хакнули, упустив функцию... 
вы запустите с использование decltype (f(5)) 
smile
тогда и получите вывод типа.. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 4.3.2012, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  4.3.2012,  23:02 Найти цитируемый пост)
вы запустите с использование decltype (f(5))

я об этом и говорил, говоря что "auto i = expr;" разворачивается в "decltype(expr) i = expr;", и дополнял, "это decltype с немного иной семантикой"

испорченный телефон получился.
PM WWW   Вверх
newbee
Дата 4.3.2012, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Арррррррггггггггххххххххх бустик, ты этот пример видел? Семантика, семантика, семантика, даже в лиспосрачах столько раз бездумно про семантику не тяфкнут.

Цитата

    auto a = v[0];        // a has type int
    decltype(v[0]) b = 1; // b has type const int&, the return type of
                        // std::vector<int>::operator[](size_type) const



--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 4.3.2012, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



читай выше.
PM WWW   Вверх
mes
Дата 4.3.2012, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  4.3.2012,  22:11 Найти цитируемый пост)
я об этом и говорил, говоря что "auto i = expr;" разворачивается в "decltype(expr) i = expr;", и дополнял, "это decltype с немного иной семантикой"

какое отношение decltype имеет к нижеследующему коду ? : 
Код

auto f(auto i, auto j)
{
   return i+j;
}



--------------------
PM MAIL WWW   Вверх
volatile
Дата 4.3.2012, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Эй, господа. Вы что напали на человека?
Ну хорошо, согласен, можно придумать какой-то изворот, где синтаксически нельзя вставить decltype, а auto можно.
Ну и что?  Что это доказывает?
Разницы между ними принципиальной нет!

Тип должен быть известен и точно определен, на момент компиляции данной единицы трансляции.
И никак иначе.

PM MAIL   Вверх
mes
Дата 4.3.2012, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  4.3.2012,  22:30 Найти цитируемый пост)
Тип должен быть известен и точно определен, на момент компиляции данной единицы трансляции.
И никак иначе.

даже в таких условиях как широк простор действий smile

Добавлено через 1 минуту и 3 секунды
Цитата(volatile @  4.3.2012,  22:30 Найти цитируемый пост)
 можно придумать какой-то изворот, где синтаксически нельзя вставить decltype, а auto можно.

дело не в извороте, а в концепции...

Добавлено через 4 минуты и 20 секунд
auto позволяет 
Цитата(volatile @  4.3.2012,  22:30 Найти цитируемый пост)
Разницы между ними принципиальной нет!

межеду выводом типом и запросом такая же разница как между специализацией и перегрузкой ))



--------------------
PM MAIL WWW   Вверх
volatile
Дата 4.3.2012, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



mes
Насчет утверждения бусткодера что ауто определяется через деклтайп, ничего говорить не буду.
В принципе это внутреняя кухня компилятора, и да, скорей всего это не так, но дело в принципе не в этом.

А вот с таким утверждением
Цитата(k0rvin @  4.3.2012,  14:53 Найти цитируемый пост)
auto же вычисляет тип выражения, тип которого, заранее неизвестен

Согласиться не могу.
Это чушь, причем абсолютная и полная.

PM MAIL   Вверх
mes
Дата 5.3.2012, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  4.3.2012,  22:56 Найти цитируемый пост)
Согласиться не могу.
Это чушь, причем абсолютная и полная.

 с чем не согласны ? что тип в левой части выражения не известен ? 
если говорят "позже" это не значит что в рантайме..  в режиме компиляции есть тоже позже и раньше... smile





--------------------
PM MAIL WWW   Вверх
newbee
Дата 5.3.2012, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(volatile @  5.3.2012,  00:56 Найти цитируемый пост)
Согласиться не могу.
Потому что ты просто не можешь понять, что тебе говорят. Не ты один и не в первый раз. Все зависит от того, что считать под "заранее неизвестная". Если "оставим это до рантайма", как, я думаю, ты это понимаешь, конечно это чушь, маразм и вообще. Но это маразм понимающего, а не объясняющего.



--------------------
You're face to face
With man who sold the world
PM   Вверх
volatile
Дата 5.3.2012, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(newbee @  5.3.2012,  00:05 Найти цитируемый пост)
Все зависит от того, что считать под "заранее неизвестная". 

Ну да, согласен, сначала нужно определить что понимать под термином, а потом уже спорить.
а что под этим понимаете вы?
PM MAIL   Вверх
mes
Дата 5.3.2012, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



volatile,, грубо,  означает что тип переменной определяется ниже по тексту .. 
smile



--------------------
PM MAIL WWW   Вверх
volatile
Дата 5.3.2012, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(mes @  5.3.2012,  00:32 Найти цитируемый пост)
ниже по тексту .. 

щас просмотрел ваши посты, и как назло, нигде не нашел, где именно тип определяется ниже по тексту.
возможно конечно что-то пропустил  smile 
Цитата(mes @  4.3.2012,  21:31 Найти цитируемый пост)
template <typename T>
struct A {};
template <typename T>
A<T> f(T  ) { return A<T> (); } 


int main() {
   A<auto> a =  f (5);
}


Цитата(newbee @  4.3.2012,  22:10 Найти цитируемый пост)
template<typename T>
struct X{};

X<int> foo(std::string const&);

X<auto> x=foo("Alice Cooper - Hey stupid");


Везде тип определен, и определен строго выше. (ну или в той-же самой строчке)

PM MAIL   Вверх
newbee
Дата 5.3.2012, 01:01 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(volatile @  5.3.2012,  01:44 Найти цитируемый пост)
(ну или в той-же самой строчке)
"Справа" по тексту это тоже "ниже".



--------------------
You're face to face
With man who sold the world
PM   Вверх
volatile
Дата 5.3.2012, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Подведем итоги
Цитата(k0rvin @  4.3.2012,  14:53 Найти цитируемый пост)
auto же вычисляет тип выражения, тип которого, заранее неизвестен.

Цитата(newbee @  5.3.2012,  00:05 Найти цитируемый пост)
Все зависит от того, что считать под "заранее неизвестная". 

Цитата(mes @  5.3.2012,  00:32 Найти цитируемый пост)
грубо,  означает что тип переменной определяется ниже по тексту 

Цитата(newbee @  5.3.2012,  01:01 Найти цитируемый пост)
"Справа" по тексту это тоже "ниже".


Итак, к чему нас привела логическая цепочка:
Цитата
auto же вычисляет тип выражения, находящегося справа по тексту


Замечательно!
Стоило ли разводить столько шума?  smile

Добавлено через 1 минуту и 36 секунд
Кто бы с этим спорил  smile 
PM MAIL   Вверх
mes
Дата 5.3.2012, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  4.3.2012,  23:44 Найти цитируемый пост)
Везде тип определен, и определен строго выше. 

определены другие типых, а наш либо запрошен до/при определении ( при  decltype(expr) val = expr ) либо выведен (auto) после определения... 




--------------------
PM MAIL WWW   Вверх
newbee
Дата 5.3.2012, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(volatile @  5.3.2012,  02:16 Найти цитируемый пост)
Стоило ли разводить столько шума? 
Шумел тут только один благородный дон по-моему, а целая бригада врачей пыталась его успокоить.



--------------------
You're face to face
With man who sold the world
PM   Вверх
mes
Дата 5.3.2012, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  5.3.2012,  00:16 Найти цитируемый пост)
Замечательно!
Стоило ли разводить столько шума? 

ну это вопрос к тем, кто сразу шуметь начал, вместо попытки понять сказанное smile

Добавлено через 1 минуту и 30 секунд
Цитата(volatile @  5.3.2012,  00:16 Найти цитируемый пост)
 к чему нас привела логическая цепочка:

эта логическая цепочка было определена еще в самом начале разгорания шума, однако ж от дальнейшего его развития не спасла ))




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 5.3.2012, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



раз я задался этим вопросом, очевидно, что я не не знаю на него ответа.
но три страницы примеров и "разговоров" которые никак не отвечают на вопрос, согласитесь, начнут раздражать любого. ибо это смотрится смешно.
типа: "я умный. я тебе показываю. а ты дебил, не понимаешь."

прошу прощения за грубость. но чем так "объяснять" - лучше молчать.

не пришла бы ньюбка, еще бы несколько страниц вы мне "объясняли".
спасибо.

PM WWW   Вверх
boostcoder
Дата 5.3.2012, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(k0rvin @  4.3.2012,  14:53 Найти цитируемый пост)
Decltype берет тип от выражения, тип которого уже известен (задекларирован). auto же вычисляет тип выражения, тип которого, заранее неизвестен.

что-то тут не вяжется...

Добавлено через 40 секунд
Цитата(boostcoder @  5.3.2012,  07:18 Найти цитируемый пост)
три страницы

а нет. их таки пять.
PM WWW   Вверх
boostcoder
Дата 5.3.2012, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



этим поставим точку в примерах с auto в качестве параметра шаблона.
еще "объяснения" будут?

Это сообщение отредактировал(а) boostcoder - 5.3.2012, 09:35
PM WWW   Вверх
rumit7
Дата 5.3.2012, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 16.6.2011

Репутация: 6
Всего: 7



Цитата(boostcoder @ 1.3.2012,  19:44)
Цитата

new auto(a)

кто-нибудь, объясните, как это работает.
я представляю то вместо auto тут должен быть decltype():
Цитата

new decltype(a)(a);

http://liveworkspace.org/code/9f1050e8f6d4...dc87286e11985cd

C++ 2011 (draft n3290), 7.1.6.4 auto specifier:

Цитата

...
4. The auto type-specifier can also be used in declaring a variable in the condition of a selection statement (6.4) or
     an iteration statement (6.5), in the type-specifier-seq in the new-type-id or type-id of a new-expression (5.3.4), in
     a for-range-declaration, and in declaring a static data member with a brace-or-equal-initializer that appears
     within the member-specification of a class definition (9.4.2).
...


С "new auto(a)" по стандарту вроде все нормально, а вот на счет следующего кода у меня большие сомнения.

Код

template<typename T>
struct X{};
X<int> foo(std::string const&);
X<auto> x=foo("Alice Cooper - Hey stupid");


Во всяком случае в стандарте четко указаны случаи, где можно использовать auto. А вот пункт, легализирующий выше приведенный код, я не увидел:

C++ 2011 (draft n3290), 7.1.6.4 auto specifier:

Цитата

1 The auto type-specifier signifies that the type of a variable being declared shall be deduced from its initializer
    or that a function declarator shall include a trailing-return-type.

2 The auto type-specifier may appear with a function declarator with a trailing-return-type (8.3.5) in any
    context where such a declarator is valid.

3 Otherwise, the type of the variable is deduced from its initializer. The name of the variable being declared
    shall not appear in the initializer expression. This use of auto is allowed when declaring variables in a
    block (6.3), in namespace scope (3.3.6), and in a for-init-statement (6.5.3). auto shall appear as one of
    the decl-specifiers in the decl-specifier-seq and the decl-specifier-seq shall be followed by one or more init-
    declarators, each of which shall have a non-empty initializer.

  [ Example:
                                      // OK: x has type int
     auto x = 5;
                                      // OK: v has type const int*, u has type const int
     const auto *v = &x, u = 6;
                                      // OK: y has type double
     static auto y = 0.0;
                                      // error: auto is not a storage-class-specifier
     auto int r;
   — end example ]

4 The auto type-specifier can also be used in declaring a variable in the condition of a selection statement (6.4) or
    an iteration statement (6.5), in the type-specifier-seq in the new-type-id or type-id of a new-expression (5.3.4), in
    a for-range-declaration, and in declaring a static data member with a brace-or-equal-initializer that appears
    within the member-specification of a class definition (9.4.2).

5 A program that uses auto in a context not explicitly allowed in this section is ill-formed.

6 Once the type of a declarator-id has been determined according to 8.3, the type of the declared variable
    using the declarator-id is determined from the type of its initializer using the rules for template argument
    deduction. Let T be the type that has been determined for a variable identifier d. Obtain P from T by
    replacing the occurrences of auto with either a new invented type template parameter U or, if the initializer
    is a braced-init-list (8.5.4), with std::initializer_list<U>. The type deduced for the variable d is then
    the deduced A determined using the rules of template argument deduction from a function call (14.8.2.1),
    where P is a function template parameter type and the initializer for d is the corresponding argument. If
    the deduction fails, the declaration is ill-formed. 

  [ Example:
                                      // decltype(x1) is std::initializer_list<int>
     auto x1 = { 1, 2 };
                                      // error: cannot deduce element type
     auto x2 = { 1, 2.0 };
   — end example ]

7 If the list of declarators contains more than one declarator, the type of each declared variable is determined
  as described above. If the type deduced for the template parameter U is not the same in each deduction, the
  program is ill-formed.

  [ Example:
     const auto &i = expr;

  The type of i is the deduced type of the parameter u in the call f(expr) of the following invented function
  template:
     template <class U> void f(const U& u);
   — end example ]

PM MAIL   Вверх
baldina
Дата 5.3.2012, 18:37 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



сколько интересного я пропустил...
а уж сколько нового узнал smile

кстати, насчет семантики. я (простите мою склонность к обобщениям и упрощениям) понимаю decltyte(x) как - "верни(подставь) тип выражения х". тип, естественно, известный (компилятору) в этой точке.
a auto x=y - как "определи-ка сам тип выражения х по выражению y", т.е. еще неизвестный компилятору, но который компилятор может вывести.
поэтому и конструкция была вида p=auto(x), но не decltype()
ну и несколько магический вид, конечно, привлекает

еще не пойму чего на k0rvin набросились. вот в случае определения типов при использовании шаблонов говорят о выводе типа (компилятором), однако  это никого не смущает, никто не кричит что С++ статически типизирован. все и так ясно.
PM MAIL   Вверх
volatile
Дата 6.3.2012, 00:12 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(baldina @  5.3.2012,  18:37 Найти цитируемый пост)
определи-ка сам тип выражения х по выражению y", т.е. еще неизвестный компилятору

я просто думаю что здесь не совсем уместно слово неизвестный. Оно сбивает с толку.
Допускаю что эту терминологию придумали не здесь, а кто-то "свыше спустил", но тем не менее, 
Если так рассуждать, то
Код

int func (int, int);
char* func (int);
int c = func (1, 2);
Здесь (с) принимает значение заранее неивестнго типа от функции, с заранее неивестным количесвом аргуметнов.
Разве нет? оно находится справа по тексту, значит, согласно принятой ныне терминологии, оно неизвестно.

Лучше называть вещи своими именами. 
вычисляет выражение стоящее справа по тексту -  имхо, четко и ясно.

PM MAIL   Вверх
mes
Дата 6.3.2012, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



rumit7
Цитата(rumit7 @  5.3.2012,  08:36 Найти цитируемый пост)
, где можно использовать auto

в теме уже было написано, на текущий момент auto не предтавляет всех, тех возможностей, возложенных на него.. будем-с ждать smile
но это не мешает рассуждать  и сравнивать... спор по сути был не об auto, а о type querying и type deduction.. с отклонением на понятие "неизвестного на данный момент типа"..

Добавлено через 5 минут и 2 секунды
Цитата(baldina @  5.3.2012,  17:37 Найти цитируемый пост)
 вот в случае определения типов при использовании шаблонов говорят о выводе типа (компилятором),

просто когда речь касается "неизвестности типа"  рассуждают с точки зрения конечного  результата.. Тип же в конце концов становится известным компилятору ?значит известен.. И как аргумент приводят, ведь для вычисления все известно, значит и вычисленное заранее известно.. 



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 6.3.2012, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  6.3.2012,  09:14 Найти цитируемый пост)
будем-с ждать

следующего стандарта?
PM WWW   Вверх
mes
Дата 6.3.2012, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  5.3.2012,  23:12 Найти цитируемый пост)
Здесь (с) принимает значение заранее неивестнго типа от функции, с заранее неивестным количесвом аргуметнов.

здесь (с) с заранее определенным типом (инт) инициализируется результатом функции, выбранной в результате разрешения перегрузок по двум аргументам..


Это сообщение отредактировал(а) mes - 6.3.2012, 09:44


--------------------
PM MAIL WWW   Вверх
baldina
Дата 6.3.2012, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(mes @  6.3.2012,  09:14 Найти цитируемый пост)
просто когда речь касается "неизвестности типа"  рассуждают с точки зрения конечного  результата.. Тип же в конце концов становится известным компилятору ?значит известен.. И как аргумент приводят, ведь для вычисления все известно, значит и вычисленное заранее известно.. 

с этим никто не спорит. есть процесс вывода типа, проводимый компилятором. его может произвести и человек.
когда мы пишем auto или вообще не указываем тип (в языках где это допустимо) мы просто ленимся.
так же мы ленимся самостоятельно выводить новые факты из существующих фактов и правил, возлагая это на машину вывода (в БЗ, Пролог и пр.), т.е. поручаем машине черновую трудоемкую работу.
везде, где отсутствует информация извне, результат заранее определен. только не всегда очевиден smile в таких случаях неизвестность синоним неочевидности.

PM MAIL   Вверх
mes
Дата 6.3.2012, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  5.3.2012,  23:12 Найти цитируемый пост)
вычисляет выражение стоящее справа по тексту 

тип будет вычислен по выражению стоящему дальше по тексту ..
а раз будет, то на момент определения переменной он еще неизвестен, и подставляется чуточку позже, после того, как разберется с  правостоящим выражением smile



Это сообщение отредактировал(а) mes - 6.3.2012, 09:47


--------------------
PM MAIL WWW   Вверх
baldina
Дата 6.3.2012, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(baldina @  5.3.2012,  18:37 Найти цитируемый пост)
т.е. еще неизвестный компилятору

согласен, плохо. заменить на "не очевидный мне, мне лениво" ;)
хотя все масло масляное
PM MAIL   Вверх
mes
Дата 6.3.2012, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(baldina @  6.3.2012,  08:46 Найти цитируемый пост)
везде, где отсутствует информация извне, результат заранее определен. т

если рассматривать конечную точку процесса, то да.. а взглянуть на компиляцию, как на процесс то, не важно кем делается вывод, человеком и компиляцией, мы можем сказать известен те ли на определенной момент времни или нет..  при этом проблема неизвестности встречалась в С++ и раньше, задолго до auto..
только почему то та неизвестность, никого не смущала )) 
Код

struct A {
   T a;
   typedef int T;
};


сейчас начнут призывать аргументы, что написанно не на одной строчке.. так и в статически типизированных языках auto тоже может быть написано не на одной.. 
Код

auto x;
...
x = "str";

т.е. объявляться с неизветным типом, и приобретать его в момент определения.. в конце концов тип x будет известен и его в любом случае нельзя менять..

Добавлено @ 10:02
Цитата(baldina @  6.3.2012,  08:46 Найти цитируемый пост)
 мы просто ленимся.

неа.. в данном случае речь не о лени.. мы говорим какие правила использовать.. 
и вот правила как раз и разные для запроса типа и выведения..

Добавлено @ 10:03
Цитата(boostcoder @  6.3.2012,  08:36 Найти цитируемый пост)
следующего стандарта? 

ну или переходить на языки, на которых это уже есть ))

Добавлено @ 10:08
Цитата(baldina @  6.3.2012,  08:49 Найти цитируемый пост)
 заменить на "не очевидный мне, мне лениво

вот опять.. в выражении "неизвестный тип" сам программист совсем не при чем.. речь о том кто разбирает код.. и встретив новую переменную и запомня ее, разборщик (будь он человек или машина)  не может сразу проассоциировать его с типом, а идет дальше изучать след выражение..

Добавлено @ 10:12
Цитата(baldina @  6.3.2012,  08:46 Найти цитируемый пост)
формация извне, результат заранее определен

Код

auto a = a +5;

так почему нельзя вывести тип правого выражения ? smile 



Это сообщение отредактировал(а) mes - 6.3.2012, 14:31


--------------------
PM MAIL WWW   Вверх
baldina
Дата 6.3.2012, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(mes @  6.3.2012,  09:58 Найти цитируемый пост)
Цитата(baldina @  6.3.2012,  08:46 )
 мы просто ленимся.

неа.. в данном случае речь не о лени.. мы говорим какие правила использовать.. 
и вот правила как раз и разные для запроса типа и выведения..

точнее, мы знаем правила и учитываем их. правила есть и они не меняются.
а про различие запроса типа и выведения не оспаривается

Цитата(mes @  6.3.2012,  09:58 Найти цитируемый пост)
код C++
1:
auto a = a +5;

так почему нельзя вывести тип правого выражения ?  

два ответа.
1. потому что неограниченная рекурсия
2. можно, если использовать правило приведения типов в выражении + правило приведения неизвестного типа к известному
Цитата

зависит от определения

PM MAIL   Вверх
mes
Дата 6.3.2012, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(baldina @  6.3.2012,  10:04 Найти цитируемый пост)
+ правило приведения неизвестного типа к известному

так все таки неизвестного  ? 
smile )))


Это сообщение отредактировал(а) mes - 6.3.2012, 11:15


--------------------
PM MAIL WWW   Вверх
mes
Дата 6.3.2012, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



 smile 
Цитата(baldina @  6.3.2012,  10:04 Найти цитируемый пост)
 
Цитата

мы говорим какие правила использовать.. 
и вот правила как раз и разные для запроса типа и выведения..

точнее, мы знаем правила и учитываем их. правила есть и они не меняются.

а если взглянуть на слово "правило" шире ? smile


Это сообщение отредактировал(а) mes - 6.3.2012, 14:50


--------------------
PM MAIL WWW   Вверх
baldina
Дата 6.3.2012, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(mes @  6.3.2012,  11:14 Найти цитируемый пост)
так все таки неизвестного  ? 


Цитата(baldina @  6.3.2012,  11:04 Найти цитируемый пост)
Цитата

зависит от определения


PM MAIL   Вверх
mes
Дата 6.3.2012, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(baldina @  6.3.2012,  13:56 Найти цитируемый пост)
зависит от определения


Цитата(baldina @  6.3.2012,  10:04 Найти цитируемый пост)
. потому что неограниченная рекурсия

угу, а неограчиность рекурсиии твердит нам об известности типа smile



--------------------
PM MAIL WWW   Вверх
k0rvin
Дата 7.3.2012, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Код

GHCi, version 7.0.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> let x = x + 5
Prelude> :t x
x :: Integer



--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
k0rvin
Дата 7.3.2012, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(volatile @ 5.3.2012,  01:16)
Итак, к чему нас привела логическая цепочка:
Цитата
auto же вычисляет тип выражения, находящегося справа по тексту

Стоило ли разводить столько шума?  smile

Шум был не из-за этого, а из-за того, что некоторые утверждали, что "auto x = <expr>" можно однозначно заменить на "decltype(<expr>) x = <expr>". Однако нет.Пардон, пример уже приводили.

Это сообщение отредактировал(а) k0rvin - 7.3.2012, 08:45


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 7.3.2012, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(boostcoder @  4.3.2012,  18:18 Найти цитируемый пост)
т.е. ты целую страницу разводил демагогию из-за того что auto несколько изменяет семантику decltype, и просто ухмылялся что мы "не разглядели моську"?

просто я не мог поверить, что ты таки мог придраться к этому. ибо да, auto реализован поверх decltype но с иной семантикой.

http://liveworkspace.org/code/092676eb3995...319ba83e7b42001
но обратное невозможно.

Это сообщение отредактировал(а) boostcoder - 7.3.2012, 09:04
PM WWW   Вверх
mes
Дата 7.3.2012, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(k0rvin @  7.3.2012,  07:28 Найти цитируемый пост)
 что некоторые утверждали, что "auto x = <expr>" можно однозначно заменить на "decltype(<expr>) x = <expr>"

и даже не из этого... а
Цитата(boostcoder @  7.3.2012,  07:54 Найти цитируемый пост)
 auto реализован поверх decltype но с иной семантикой

auto это не иная семантика, а иная идеология.. которая к сожалению на текущий момент не отражена в С++ в полноте своей красоты 
smile



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 7.3.2012, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  7.3.2012,  09:29 Найти цитируемый пост)
на текущий момент не отражена в С++

я не фантазер и не ясновидец. то, что Вы мне приводили в пример - в с++ невозможно в рамках текущего стандарта. и не известно, изменится ли оно когда-либо. а так да, за примеры спасибо. они мне очень помогли, и главное - сэкономили мое время потраченное на объяснения невозможного smile 

Это сообщение отредактировал(а) boostcoder - 7.3.2012, 09:40
PM WWW   Вверх
mes
Дата 7.3.2012, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  7.3.2012,  08:39 Найти цитируемый пост)
я не фантазер и не ясновидец.

да фантазия тут не причем, есть два подхода для определения типа :
auto i = 5 -> decltype (5);
auto i = 5 -> deduct(5);
и хотя они для простых случаех дают схожий результат, по сути они отличаются сильно.. и remove_ref не является сглаживателем различий..
подверждение этого явно отражено в стандарте..

Добавлено @ 10:20
а сходство между этими технологиями в следствии не развитости и ограниченности исполнения технологии..


Это сообщение отредактировал(а) mes - 7.3.2012, 10:21


--------------------
PM MAIL WWW   Вверх
k0rvin
Дата 7.3.2012, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(boostcoder @ 7.3.2012,  08:54)
http://liveworkspace.org/code/092676eb3995...319ba83e7b42001
но обратное невозможно.

typeid тебе тут не поможет: http://liveworkspace.org/code/ce69e09d185b...7ecd01e399e6f18

Добавлено через 14 минут и 47 секунд
А еще я могу просто взять и сделать бяку (кстати, при использовании в шаблоне компилятор требовал наличие typename перед remove_ref) и изменить смысл remove_ref: http://liveworkspace.org/code/39940580c716...47cc35858fcd8ee 
Хотя, помнится в С++ как-то можно было запретить дописывать специализации шаблона в других единицах трансляции, пофиксишь свой код?


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 7.3.2012, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  7.3.2012,  10:17 Найти цитируемый пост)
да фантазия тут не причем

разве?
и тут?:
Цитата(newbee @  4.3.2012,  22:10 Найти цитируемый пост)
template<typename T>
struct X{};
X<int> foo(std::string const&);
X<auto> x=foo("Alice Cooper - Hey stupid");

Цитата(mes @  4.3.2012,  23:26 Найти цитируемый пост)
auto f(auto i, auto j)
{
   return i+j;
}


Добавлено через 6 минут и 41 секунду
Цитата(k0rvin @  7.3.2012,  10:29 Найти цитируемый пост)
typeid тебе тут не поможет: http://liveworkspace.org/code/ce69e09d185b...7ecd01e399e6f18

да, ступил.

Добавлено через 8 минут и 13 секунд
Цитата(k0rvin @  7.3.2012,  10:29 Найти цитируемый пост)
я могу просто взять и сделать бяку

а я две.
разговор-то не об этом.

Цитата(k0rvin @  7.3.2012,  10:29 Найти цитируемый пост)
пофиксишь свой код?

я не знаю как...
PM WWW   Вверх
k0rvin
Дата 7.3.2012, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



[offtop]У меня одного такая фигня:
user posted image
?
Это при размере шрифта, отличном от 10pt. Firefox 8.0.1, WinXP SP3.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
borisbn
Дата 7.3.2012, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(k0rvin @  7.3.2012,  11:01 Найти цитируемый пост)
У меня одного такая фигня:

в Опере практически вообще не работает, а в хроме - при размере 11 и 12 - такая же фигня. при остальных размерах (9,10,14) - всё норм.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 7.3.2012, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(k0rvin @  7.3.2012,  11:01 Найти цитируемый пост)
У меня одного такая фигня

когда-то был такой баг. но на опере...
шрифт моноширный - на самом деле моноширный? или какой-то другой?

Добавлено через 1 минуту и 16 секунд
borisbn, там используется editarea. я пытался разобраться. но увы... если кто может помочь - договоримся.

Добавлено через 3 минуты и 48 секунд
кстати. проверьте на тесте от "производителя": http://www.cdolivet.com/editarea/editarea/...emple_full.html
на каких браузерах/ОСях бажит?
PM WWW   Вверх
k0rvin
Дата 7.3.2012, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(boostcoder @ 7.3.2012,  11:08)
шрифт моноширный - на самом деле моноширный? или какой-то другой?

Courier New, куда уж моноширинней, по скриншоту видно.

Цитата(boostcoder @ 7.3.2012,  11:08)
кстати. проверьте на тесте от "производителя": http://www.cdolivet.com/editarea/editarea/...emple_full.html
на каких браузерах/ОСях бажит?

А тут у меня нормально отображает при любых размерах шрифта.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
boostcoder
Дата 7.3.2012, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(k0rvin @  7.3.2012,  11:21 Найти цитируемый пост)
А тут у меня нормально отображает при любых размерах шрифта.

хм... кажется я понял в чем дело)
минут через 20ть исправлю.
PM WWW   Вверх
boostcoder
Дата 7.3.2012, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



в опере - с любым размером шрифта все ок.
в firefox`е - да. подтверждаю.
PM WWW   Вверх
borisbn
Дата 7.3.2012, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(boostcoder @  7.3.2012,  11:08 Найти цитируемый пост)
проверьте на тесте от "производителя":

Опера:
user posted image
Хром - всё норм.
http://liveworkspace.org/code/ce69e09d185b...7ecd01e399e6f18
в Опере всё норм.
В хроме
user posted image

у меня Windows 7


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 7.3.2012, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



чудеса какие-то  smile 
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.3622 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.