Здравствуйте, night beast, Вы писали:
NB>ну сэкономил человек на объявлении, что вы привязались. NB>суть то не в этом.
Э-э-э где и на чём съкономил?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Невероятно, но факт! Не константные значения в компайл-т
g++ (GCC) 3.4.5 (mingw special)
Нет обещанного чуда:
C:\tect>g++ -Wall -o "mag" "mag.cpp"
mag.cpp:13: warning: friend declaration `int engine(magicc&, type&)' declares a non-template function
mag.cpp:13: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning
mag.cpp: In function `int main()':
mag.cpp:21: warning: unused variable 'a'
Re[10]: Невероятно, но факт! Не константные значения в компа
если не обращать внимание на синтаксические ляпы, то какое поведение ожидается?
гсс 3.4 выводит noyes, что на мой взгляд некорректно.
E>додаток2 E>За то, что я прав, голосует ещё и то, что даже у M$ не всё так классно. Если бы всё было так, как ты думаешь, то в функции engine вроде как не был бы нужен второй аргумент...
если я правильно понимаю, второй аргумент нужен чтобы сделать вызов функии engine зависящим от параменра шаблона. это должно предотвратить подстановку функии сразу при обявлении.
Re[11]: Невероятно, но факт! Не константные значения в компа
Здравствуйте, night beast, Вы писали:
NB>>>ну сэкономил человек на объявлении, что вы привязались.
NB>
NB>friend int engine(magicc&, type&);
NB>
NB>на { return 0; }
Наверное речь шла об определнии?
Но в целом, ИМХО, это всё не важно, так как реальных вызовов функции engine нет, так что и тел нигде не останется.
А то, что "друг с телом" попадёт только вместе с объемлещим классом, то там же как раз аргумент вроде как второй для того есть.
Так что тело вроде не должно бы было помешать
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: А INTERNAL COMPILER ERROR тоже вызывает ажиотаж?
Здравствуйте, night beast, Вы писали:
NB>гсс 3.4 выводит noyes, что на мой взгляд некорректно.
Я думаю, что это дырка в стандарте. Может быть как угодно
Хотя может если полистать повнимательнее, то этот случае где-то в стандарте расталкован явно. Просто я быстро не нашёл, а долго искать не стал.
NB>если я правильно понимаю, второй аргумент нужен чтобы сделать вызов функии engine зависящим от параменра шаблона. это должно предотвратить подстановку функии сразу при обявлении.
А там однохренственно первый аргумент от параметра вроде зависит. Так что всё равно имя зависимое получается и сразу подставляться не должно бы...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: А INTERNAL COMPILER ERROR тоже вызывает ажиотаж?
Здравствуйте, Erop, Вы писали:
NB>>гсс 3.4 выводит noyes, что на мой взгляд некорректно. E>Я думаю, что это дырка в стандарте. Может быть как угодно
E>Хотя может если полистать повнимательнее, то этот случае где-то в стандарте расталкован явно. Просто я быстро не нашёл, а долго искать не стал.
я опираюсь на книгу Вандервуда. но там к сожалению (или к счастью) ссылки на стандарт нет.
NB>>если я правильно понимаю, второй аргумент нужен чтобы сделать вызов функии engine зависящим от параменра шаблона. это должно предотвратить подстановку функии сразу при обявлении.
E>А там однохренственно первый аргумент от параметра вроде зависит. Так что всё равно имя зависимое получается и сразу подставляться не должно бы...
не, первый там фиксированый: magic<char,-1>
Re[12]: Невероятно, но факт! Не константные значения в компа
Здравствуйте, Erop, Вы писали:
NB>>>>ну сэкономил человек на объявлении, что вы привязались.
NB>>
NB>>friend int engine(magicc&, type&);
NB>>
NB>>на { return 0; }
E>Наверное речь шла об определнии?
да, именно. совсем заврался
E>Но в целом, ИМХО, это всё не важно, так как реальных вызовов функции engine нет, так что и тел нигде не останется. E>А то, что "друг с телом" попадёт только вместе с объемлещим классом, то там же как раз аргумент вроде как второй для того есть. E>Так что тело вроде не должно бы было помешать
без тела оно считается вроде как глобальным а здесь
Здравствуйте, night beast, Вы писали:
NB>я опираюсь на книгу Вандервуда. но там к сожалению (или к счастью) ссылки на стандарт нет.
Книга хорошая.
Только там не всё понятно как оно должно быть.
Ещё раз повторюсь. Ситауция крайне мутная. Как будут взаимодействовать побочные последствия независимых инстанциаций шаблонов.
E>>А там однохренственно первый аргумент от параметра вроде зависит. Так что всё равно имя зависимое получается и сразу подставляться не должно бы...
NB>не, первый там фиксированый: magic<char,-1>
Упс, точно.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Невероятно, но факт! Не константные значения в компайл-т
Здравствуйте, remark, Вы писали:
R>Так вот, всё это неправда! R>Сейчас вы увидите, как на стандартном с++ можно иметь переменные значения в компайл-тайм!
R>char engine(...);
R>template<typename, int> struct magic;
R>typedef magic<char, -1> magicc;
R>template<typename type = int, int id = sizeof(engine(*(magicc*)0, *(type*)0))>
R>struct magic
R>{
R> friend int engine(magicc&, type&);
R> static const int val = id;
R>};
R>int main()
R>{
R> char a[magic<>::val != magic<>::val ? 1 : -1];
R>}
вопрос по выделенному. при замене *(magicc*)0 на magicc() получаем одинаковые magic<>::val.
чем вызвано?
ну и в magic<char,-1>::engine второй аргумент char.
Re[10]: Невероятно, но факт! Не константные значения в компа
Здравствуйте, Аноним, Вы писали:
А>Я думаю, Комо, а скорее всего, последний фронт-энд от едг (у Комо он какой-то древний уже). Уж если ЕДГ и глючит, то в совсем уж нетривиальных моментах. А>Автор упомянул ЕДГ, но я не понял, что это значит — купить его простым смертным — малореально
Здравствуйте, Erop, Вы писали:
E>В целом хотелось бы узнать почему автору кажется, что это чмстый и стандартный C++...
А почему нет?
Априори (без ссылок на стандарт) компилирование 3 самыми популярными и приближенными к стандарту компиляторами чего-то да стоит. По крайней мере того, что бы оппонент представил хотя бы какие-то факты, а не просто фразы, что это типа какая-то там некая давно известная дыра где-то
Здравствуйте, Erop, Вы писали:
E>И главное. Я так и не смог найти где же подстановка аргументов шаблона либо формирование списка областей где искать, зависит от того, какие шаблоны уже ьыли инстанциированы.
Ну а какие варианты могут быть?
У меня один вариант — зависимые аргументы шаблона по-умолчанию вычисляются в точке инстанциирования. И соответственно на это вычисление влияет всё, что видно в этой точке. К тому же по аналогии с аргументами функции по-умолчанию.
У тебя есть ещё какие-то разумные варианты?
E>ИМХО ты пользуешься дыркой в стандарте, когда ты объявляешь, фактически шаблонную функцию, как нешаблонную.
Вот это вообще не понял.
Да, я просто объявляю нешаблонную функцию, но при этом никакими дырками не пользуюсь.
Примеры таких объявлений можно увидеть и у Страуструпа, и у Саттера и у др.
E>Вроде как мы при инстанциировании шаблона FriendFake за одно породили нешаблонную функцию foo. E>(Почему нешаблонную? Да потому что при её вызове не будет явно или неявно выводится параметры шаблона)
Да, так всё и есть. Никаких проблем я не вижу.
E>ИМХО поиск и участие таких функций в разрешении неоднозначнойстей при вызове -- нифига в шаблоне не специфицированы и являются особенностью реализации шаблонов в компилятрое
При разрешении перегрузки участвуют все видимые функции. Понятия "таких" функций в стандарте вообще нет, там есть просто функции.
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>Здравствуйте, remark, Вы писали:
R>>Сейчас вы увидите, как на стандартном с++ можно иметь переменные значения в компайл-тайм! PC>Это не стандартный C++ PC>[q] PC>7.3.1.2/3
PC>Every name first declared in a namespace is a member of that namespace. If a friend declaration in a PC>non-local class first declares a class or function the friend class or function is a member of the innermost PC>enclosing namespace. The name of the friend is not found by simple name lookup until a matching declaration PC>is provided in that namespace scope (either before or after the class declaration granting friendship). If PC>a friend function is called, its name may be found by the name lookup that considers functions from namespaces PC>and classes associated with the types of the function arguments (3.4.2). When looking for a prior PC>declaration of a class or a function declared as a friend, and when the name of the friend class or PC>function is neither a qualified name nor a template-id, scopes outside the innermost enclosing namespace PC>scope are not considered. [Example:
Не понял мысль.
По-моему, эта цитата подтверждает работоспособность моего кода.
Да, я объявляю все дружественные функции в глобальном пространстве имён. Всё правильно.
Да, потом я её нахожу, т.к. тип параметра функции есть сам этот класс (если быть совсем точным, то не сам этот класс, а другая специализация этого же шаблона, но касательно областей видимости имён это ничего не меняет).
Здравствуйте, Erop, Вы писали:
E>Да вот и нет! E>Вот скажи, декларация E>
void foo( FriendFake<int>, FriendFake<float> );
E>Объявляет шаблон функции разве?
Что ты привязался к шаблонам функции? Да, я их не объявлял и не собирался объявлять. И это ни о чём не говорит. Это никак не влияет на работоспособность кода.
E>вроде как равнозначны. Обе вводят в глобальное пространство имён нешаблонную функцию void foo( int, float ) E>Так что он вполне объявляет глобальную нешаблонную функцию с параметрами зависящими от того, в какой именно инстанциации шаблона класса она введена.
Да, всё так и есть. В чём проблема?
E>Как влияют эти функции напоиск кандидатов при разрешении неоднозначностей --
Так же как и всё остальные.
Нет понятия каких-то "других" функций, есть просто функции и они все равнозначны и одинакого влияют на разрешение перегрузки.
Здравствуйте, np9mi7, Вы писали:
N>Здравствуйте, remark, Вы писали:
R>>3. ... не знаю как назвать... легче на примере показать. Допустим есть класс:
R>>В реальности ещё приходится делать поправку на выравнивание, но это уже детали.
N>Каким образом делается поправка на выравнивание?