Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Указатели на неименованные перечисления


Автор: null56 1.3.2012, 14:18
Всем привет

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

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

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

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


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

заранее благодарен всем откликнувшимся

Автор: borisbn 1.3.2012, 16:22
Цитата(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/7c03a8e84e25a7b2c150ce02c51f0c9c

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

это лучшая строка в коде smile 

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

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

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

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

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

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

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

Автор: null56 1.3.2012, 18:25
отличные ответы, спасибо

Автор: boostcoder 1.3.2012, 19:44
Цитата

new auto(a)

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

new decltype(a)(a);

http://liveworkspace.org/code/9f1050e8f6d489757dc87286e11985cd

Автор: k0rvin 1.3.2012, 21:56
Цитата(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 из того перечисления.

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

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

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

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

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

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

Автор: 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;
}

http://liveworkspace.org/code/f17ca1e0ea031496f9b0adeb80c7e800

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

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

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

я решил не отвечать на это.

Автор: k0rvin 2.3.2012, 15:31
Цитата(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)
ну, вообще-то, да.

Судя по http://en.wikipedia.org/wiki/Decltype в вике, вообще-то нет.

Автор: borisbn 2.3.2012, 16:27
Цитата(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 не так...

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

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

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

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

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

неправда smile

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

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

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

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

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

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

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


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

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

Автор: k0rvin 4.3.2012, 16:50
Цитата(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

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

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

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

Автор: k0rvin 4.3.2012, 17:21
Цитата(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
}


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


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

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


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

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

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

а что же это?

Автор: 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
                        // 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 
С/С++ язык со статической типизацией - и этим все сказано.

Автор: boostcoder 4.3.2012, 17:51
http://stackoverflow.com/questions/6869888/the-relationship-between-auto-and-decltype

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

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

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

Автор: k0rvin 4.3.2012, 17:55
Цитата(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/the-relationship-between-auto-and-decltype

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

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


Автор: k0rvin 4.3.2012, 18:08
Цитата(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 разная семантика.

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

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

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

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

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

Автор: 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;


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

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

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

не совсем то, с чем можно согласиться...  smile 

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

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

Автор: 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:48
Цитата(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;

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

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

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

Автор: mes 4.3.2012, 20:17
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

Автор: boostcoder 4.3.2012, 20:41
mes, называйте как угодно.
цель одна?
auto выводит тип?

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

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

зы
залезу я все же на stackoverflow...

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

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

Автор: boostcoder 4.3.2012, 21:19
Цитата(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);

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



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

а этот код разве должен компилится?
http://liveworkspace.org/code/fa66874e2d85fc4da5d7ae138ce15e71

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

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

Автор: boostcoder 4.3.2012, 21:25
зато с decltype все в порядке: http://liveworkspace.org/code/81fea29a4f587d224a1711b4de18e78e

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

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

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

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

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

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

Автор: mes 4.3.2012, 21:31
Цитата(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);
}

Автор: boostcoder 4.3.2012, 21:32
а этот код точно корректный?

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

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

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

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

Автор: mes 4.3.2012, 21:40
Цитата(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/docs/papers/2003/n1478.pdf

Автор: boostcoder 4.3.2012, 21:42
я понимаю о чем там говорится. но я не понимаю почему..

Автор: mes 4.3.2012, 21:43
Цитата

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, говорят что вывод типа и запрос типа имеют разное поведение, а не одно наследует другое.. 


Автор: boostcoder 4.3.2012, 21:48
Код

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()

Автор: mes 4.3.2012, 21:50
Цитата(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); 


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

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


Код

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


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

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

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

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

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

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

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

Автор: mes 4.3.2012, 22:09
в случае с A<..> f ()  возвращает А<>.. 

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


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


Автор: newbee 4.3.2012, 22:10
Цитата(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.

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

Автор: boostcoder 4.3.2012, 22:17
Цитата(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  не смог.

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

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

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

по сути да )

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

http://liveworkspace.org/code/c800847632af73e27cc2efeabb2c6519

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

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

Добавлено через 5 минут и 4 секунды
сто процентное отличие auto от decltype, проявляется только в примере ньюби.

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

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

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

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

испорченный телефон получился.

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

Цитата

    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

Автор: boostcoder 4.3.2012, 23:22
читай выше.

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

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

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

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

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

Автор: mes 4.3.2012, 23:42
Цитата(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 Найти цитируемый пост)
Разницы между ними принципиальной нет!

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

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

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

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

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

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



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

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

Ну да, согласен, сначала нужно определить что понимать под термином, а потом уже спорить.
а что под этим понимаете вы?

Автор: mes 5.3.2012, 00:32
volatile,, грубо,  означает что тип переменной определяется ниже по тексту .. 
smile

Автор: volatile 5.3.2012, 00:44
Цитата(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");


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

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

Автор: volatile 5.3.2012, 01:16
Подведем итоги
Цитата(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 

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

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


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

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

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

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

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


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

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

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

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

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

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

а нет. их таки пять.

Автор: boostcoder 5.3.2012, 09:35
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#625 поставим точку в примерах с auto в качестве параметра шаблона.
еще "объяснения" будут?

Автор: rumit7 5.3.2012, 09:36
Цитата(boostcoder @ 1.3.2012,  19:44)
Цитата

new auto(a)

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

new decltype(a)(a);

http://liveworkspace.org/code/9f1050e8f6d489757dc87286e11985cd

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 ]

Автор: baldina 5.3.2012, 18:37
сколько интересного я пропустил...
а уж сколько нового узнал smile

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

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

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

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

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

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

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

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

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

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

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

следующего стандарта?

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

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

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

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

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

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


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

согласен, плохо. заменить на "не очевидный мне, мне лениво" ;)
хотя все масло масляное

Автор: mes 6.3.2012, 09:58
Цитата(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 


Автор: baldina 6.3.2012, 11:04
Цитата(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. можно, если использовать правило приведения типов в выражении + правило приведения неизвестного типа к известному
Цитата

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

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

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

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

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

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

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

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


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

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


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


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

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

Автор: k0rvin 7.3.2012, 07:38
Код

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Автор: k0rvin 7.3.2012, 10:29
Цитата(boostcoder @ 7.3.2012,  08:54)
http://liveworkspace.org/code/092676eb3995f7890319ba83e7b42001
но обратное невозможно.

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

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

Автор: boostcoder 7.3.2012, 10:49
Цитата(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 Найти цитируемый пост)
пофиксишь свой код?

я не знаю как...

Автор: k0rvin 7.3.2012, 11:01
[offtop]У меня одного такая фигня:
http://itmages.ru/image/view/446952/70e4f141
?
Это при размере шрифта, отличном от 10pt. Firefox 8.0.1, WinXP SP3.

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

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

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

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

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

Добавлено через 3 минуты и 48 секунд
кстати. проверьте на тесте от "производителя": http://www.cdolivet.com/editarea/editarea/exemples/exemple_full.html
на каких браузерах/ОСях бажит?

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

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

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

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

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

хм... кажется я понял в чем дело)
минут через 20ть исправлю.

Автор: boostcoder 7.3.2012, 12:37
в опере - с любым размером шрифта все ок.
в firefox`е - да. подтверждаю.

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

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

у меня Windows 7

Автор: boostcoder 7.3.2012, 15:35
чудеса какие-то  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)