Здравствуйте, Lorenzo_LAMAS, Вы писали:
R>>Да нет же! Именно функция! Вот это компилируется без ошибок: L_L>Я не согласен, и возможно, не прав. Как мне кажется синтаксис — вещь фиксированная. Если есть какая-то конструкция, то выбираться должно однозначно — объявление ли это объекта, или объявление функции. Ты же сам видел, без всех твоих добавленных фокусов с указателями и т.п. — комо что-то говорил про оператор ().
То что, выбираться должно однозначно и не должно возникать ситуации, когда одна и та же конструкция воспринимается то определением переменной-объекта, то объявлением функции — это бесспорно. Но последний мой пример, приведенный здесь
, однозначно показывает, что при определенных условиях Комо (а также и MSVC) сбиваются и начинают ошибочно трактовать x именно как объявление функции. Иначе выражение: Y* y = x; не скомпилировалось бы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
R>>Да нет же! Именно функция! Вот это компилируется без ошибок: L_L>Я не согласен, и возможно, не прав. Как мне кажется синтаксис — вещь фиксированная. Если есть какая-то конструкция, то выбираться должно однозначно — объявление ли это объекта, или объявление функции. Ты же сам видел, без всех твоих добавленных фокусов с указателями и т.п. — комо что-то говорил про оператор ().
Кстати, надеюсь, это не уведет разговор еще дальше в сторону, но вот еще пример
class X
{
};
template<class T>
class A
{
public:
A()
{
X a(T::foo);
a = 10;
}
};
Комо выдает тут ошибку.
"ComeauTest.c", line 12: error: no operator "=" matches these operands
operand types are: X = int
a = 10;
^
т.е. он однозначно (и правильно, по-моему), решил, что это объявление объекта.
А вот на таком коде
class X
{
};
template<class T>
class A
{
public:
A()
{
X a(T::foo);
}
};
struct XX
{
typedef int foo;
};
A<XX> a;
он уже стал считать, что X a — это функция в глобальном пространстве имен и заругался на несовместимый тип в повторном объявлении. Надо не полениться и почитать стандарт, конечно. Но я считал (и считаю), что смысл подобного
объявления не должен зависеть от типа, которым инстанцируют шаблон.
Of course, the code must be complete enough to compile and link.
R>То что, выбираться должно однозначно и не должно возникать ситуации, когда одна и та же конструкция воспринимается то определением переменной-объекта, то объявлением функции — это бесспорно.
Ага, в этом мы согласны, уже хорошо. Осталось как-то проверить, правы ли мы (применительно к именно нашему конкретному A x(T::foo) ).
R> Но последний мой пример, приведенный здесь
, однозначно показывает, что при определенных условиях Комо (а также и MSVC) сбиваются и начинают ошибочно трактовать x именно как объявление функции. Иначе выражение: Y* y = x; не скомпилировалось бы.
Так я не спорю с этим.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
R>>То что, выбираться должно однозначно и не должно возникать ситуации, когда одна и та же конструкция воспринимается то определением переменной-объекта, то объявлением функции — это бесспорно.
L_L>Ага, в этом мы согласны, уже хорошо. Осталось как-то проверить, правы ли мы (применительно к именно нашему конкретному A x(T::foo) ).
Да даже не заглядывая в стандарт, я знаю точно, что выражение T::foo внутри шаблона, без ключевого слова typename не должно трактоваться как тип, а значит и выражение A x(T::foo) не должно трактоваться как объявление функции. Я эту мысль выражал еще здесь
, однозначно показывает, что при определенных условиях Комо (а также и MSVC) сбиваются и начинают ошибочно трактовать x именно как объявление функции. Иначе выражение: Y* y = x; не скомпилировалось бы.
L_L>Так я не спорю с этим.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
R>Да даже не заглядывая в стандарт, я знаю точно, что выражение T::foo внутри шаблона, без ключевого слова typename не должно трактоваться как тип, а значит и выражение A x(T::foo) не должно трактоваться как объявление функции. Я эту мысль выражал еще здесь
Я ее тоже выразил в ответе Коденку, но потом снес его (ответ мне показался неполиткорректным )
Кстати, думаю, он, когда придумал этот пример вряд ли понял, что именно этот пример значит.
А с компиляторами прям беда.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Кстати, думаю, он, когда придумал этот пример вряд ли понял, что именно этот пример значит.
Тут вариантов ровно два: если он сам его придумал, то, скорее всего, все он понял, но решил провокацию запустить. Второй вариант — пример он от куда-то содрал. Надо у него спросить, как было на самом деле
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
R>Тут вариантов ровно два: если он сам его придумал, то, скорее всего, все он понял, но решил провокацию запустить. Второй вариант — пример он от куда-то содрал. Надо у него спросить, как было на самом деле
Нет, я думаю, он его привел именно чтобы показать, что вот тут функция, вот тут объект.
Of course, the code must be complete enough to compile and link.
Кё>И мы все знаем, что дело совсем не в чудовищном невезении С++, из-за которого над компиляторами работают сплошь одни неумехи
Да. Тем более, что над EDG фронт-эндом (который использует комо) работают как раз лучшие из лучших в этом деле
Но, думается мне, если взяться за любой другой популярный язык, можно будет и там найти немало противных косяков.
Ошибаются все
Of course, the code must be complete enough to compile and link.
Здравствуйте, Кодёнок, Вы писали:
Кё>Здравствуйте, Lorenzo_LAMAS, Вы писали:
Кё>(Сменил имена — дабы не вводить людей в заблуждение лишний раз)
Кё>Задача: объяснить блондинке разницу между двумя строчками. Главный козырь блондинки — вопрос «но почему пишется-то одинаково?»
Хороший пример.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Кодёнок, Вы писали:
Кё>Здравствуйте, Lorenzo_LAMAS, Вы писали:
Кё>(Сменил имена — дабы не вводить людей в заблуждение лишний раз)
Кё>Задача: объяснить блондинке разницу между двумя строчками. Главный козырь блондинки — вопрос «но почему пишется-то одинаково?»
Кё>
Кё>struct A {
Кё>} x[1];
Кё>template <A* m> struct B {
Кё> B(int) {}
Кё>};
Кё>int main()
Кё>{
Кё> new A<x>(0);
Кё> new B<x>(0);
Кё>}
Кё>
Я сам чуть блондинкой не стал, пока въехал, что тут вообще написано :D
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Кодёнок, Вы писали:
Кё>>Здравствуйте, Lorenzo_LAMAS, Вы писали:
Кё>>(Сменил имена — дабы не вводить людей в заблуждение лишний раз)
Кё>>Задача: объяснить блондинке разницу между двумя строчками. Главный козырь блондинки — вопрос «но почему пишется-то одинаково?»
Кё>>
Кё>>struct A {
Кё>>} x[1];
Кё>>template <A* m> struct B {
Кё>> B(int) {}
Кё>>};
Кё>>int main()
Кё>>{
Кё>> new A < x > (0);
Кё>> new B<x>(0);
Кё>>}
Кё>>
R>Я сам чуть блондинкой не стал, пока въехал, что тут вообще написано :D
Созданный по new A как поинтер сранвиваем с x и x с 0?
Здравствуйте, Константин Л., Вы писали:
КЛ>Здравствуйте, rg45, Вы писали:
R>>Здравствуйте, Кодёнок, Вы писали:
Кё>>>Здравствуйте, Lorenzo_LAMAS, Вы писали:
Кё>>>(Сменил имена — дабы не вводить людей в заблуждение лишний раз)
Кё>>>Задача: объяснить блондинке разницу между двумя строчками. Главный козырь блондинки — вопрос «но почему пишется-то одинаково?»
Кё>>>
Кё>>>struct A {
Кё>>>} x[1];
Кё>>>template <A* m> struct B {
Кё>>> B(int) {}
Кё>>>};
Кё>>>int main()
Кё>>>{
Кё>>> new A < x > (0);
Кё>>> new B<x>(0);
Кё>>>}
Кё>>>
R>>Я сам чуть блондинкой не стал, пока въехал, что тут вообще написано :D
КЛ>Созданный по new A как поинтер сранвиваем с x и x с 0?
Ну почти. Результат сравниения двух указателей, который имеет тип bool, сравниваем с нулем.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Кодёнок, Вы писали:
Кё>Задача: объяснить блондинке разницу между двумя строчками. Главный козырь блондинки — вопрос «но почему пишется-то одинаково?»
Кё>
Кё> new A<x>(0);
Кё>
П что тут объяснять?
UB оно UB и есть...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском