O>Что это: лень, здоровый прагматизм или просто до первого багфикса оставили?
А зачем тут const_cast? Выражение this_type(rhs) создает временный объект, который хоть и является rvalue, но для него по стандарту можно вызывать неконстантные методы, в данном случае — swap. Ну а выражению *this const_cast и подавно не нужен — это lvalue.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
R>Выражение this_type(rhs) создает временный объект, который хоть и является rvalue, но для него по стандарту можно вызывать неконстантные методы, в данном случае — swap.
Во как! Это я и не подумал. Считал, что вызывается метод swap у rhs, а не у временного объекта. Мозгодробительно, имхо.
Здравствуйте, oziro, Вы писали:
O>Во как! Это я и не подумал. Считал, что вызывается метод swap у rhs, а не у временного объекта. Мозгодробительно, имхо.
Но это же одно из самых замечательных свойств С++! Вот тебе еще пример: сколько звездочек выведет программа?
#include <stdio.h>
struct A {
A(...) {
printf("*");
}
};
int main()
{
A three(666, 666, 666);
A two(666, 666);
A one(666);
A zero();
}
O>Во как! Это я и не подумал. Считал, что вызывается метод swap у rhs, а не у временного объекта. Мозгодробительно, имхо.
Это exception-safety. Потому так и пишут.
Здравствуйте, Кодёнок, Вы писали:
Кё>Здравствуйте, oziro, Вы писали:
O>>Во как! Это я и не подумал. Считал, что вызывается метод swap у rhs, а не у временного объекта. Мозгодробительно, имхо.
Кё>Но это же одно из самых замечательных свойств С++! Вот тебе еще пример: сколько звездочек выведет программа?
Кё>
Кё>#include <stdio.h>
Кё>struct A {
Кё> A(...) {
Кё> printf("*");
Кё> }
Кё>};
Кё>int main()
Кё>{
Кё> A three(666, 666, 666);
Кё> A two(666, 666);
Кё> A one(666);
Кё> A zero();
Кё>}
Кё>
а почему вы решили, что определение конструктора с переменным числом параметров определяет также конструктор по-умолчанию?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Кодёнок, Вы писали:
Кё>>Здравствуйте, oziro, Вы писали:
А>а почему вы решили, что определение конструктора с переменным числом параметров определяет также конструктор по-умолчанию?
более того, то же относится и к конструктору копирования, который должен быть определен явно, а не опосредованно (включая и шаблонные конструкторы)
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, Кодёнок, Вы писали:
Кё>>Здравствуйте, oziro, Вы писали:
O>>>Во как! Это я и не подумал. Считал, что вызывается метод swap у rhs, а не у временного объекта. Мозгодробительно, имхо.
Кё>>Но это же одно из самых замечательных свойств С++! Вот тебе еще пример: сколько звездочек выведет программа?
Кё>>
Кё>>#include <stdio.h>
Кё>>struct A {
Кё>> A(...) {
Кё>> printf("*");
Кё>> }
Кё>>};
Кё>>int main()
Кё>>{
Кё>> A three(666, 666, 666);
Кё>> A two(666, 666);
Кё>> A one(666);
Кё>> A zero();
Кё>>}
Кё>>
А>а почему вы решили, что определение конструктора с переменным числом параметров определяет также конструктор по-умолчанию?
Тут ведь главная замануха-то в чем: выражение A zero(); не создает переменную с именем zero, а объявляет функцию с именем zero и результатом типа A!.
Но каким образом это связано с топиком, я не понял
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Аноним, Вы писали:
O>>Во как! Это я и не подумал. Считал, что вызывается метод swap у rhs, а не у временного объекта. Мозгодробительно, имхо. А>Это exception-safety. Потому так и пишут.
Здравствуйте, rg45, Вы писали:
R>Тут ведь главная замануха-то в чем: выражение A zero(); не создает переменную с именем zero, а объявляет функцию с именем zero и результатом типа A!.
Именно. А конструктор по умолчанию тут ни при чем, как аноним написал.
Но это я между прочим самый простой случай привел, для 1-го класса! Бывает и хуже ведь
#include <stdio.h>
struct A {
A(...) {
printf("*");
}
};
template <class T> struct Main : public T
{
static void Run()
{
A x(T::foo);
}
};
struct Ansi {
typedef int foo;
};
struct Unicode {
enum { foo };
};
int main()
{
Main<Ansi>::Run();
Main<Unicode>::Run();
}
Сколько звездочек выведется? Вы всё еще любите С++?
R>Но каким образом это связано с топиком, я не понял
Просто поддержал разговором комментарий «мозгодробительно»
Здравствуйте, Кодёнок, Вы писали:
Кё>Здравствуйте, rg45, Вы писали:
R>>Тут ведь главная замануха-то в чем: выражение A zero(); не создает переменную с именем zero, а объявляет функцию с именем zero и результатом типа A!.
Кё>Именно. А конструктор по умолчанию тут ни при чем, как аноним написал.
Кё>Но это я между прочим самый простой случай привел, для 1-го класса! Бывает и хуже ведь
Кё>
Кё>#include <stdio.h>
Кё>struct A {
Кё> A(...) {
Кё> printf("*");
Кё> }
Кё>};
Кё>template <class T> struct Main : public T
Кё>{
Кё> static void Run()
Кё> {
Кё> A x(T::foo);
Кё> }
Кё>};
Кё>struct Ansi {
Кё> typedef int foo;
Кё>};
Кё>struct Unicode {
Кё> enum { foo };
Кё>};
Кё>int main()
Кё>{
Кё> Main<Ansi>::Run();
Кё> Main<Unicode>::Run();
Кё>}
Кё>
Кё>Сколько звездочек выведется? Вы всё еще любите С++?
Ну, впринципе, все тоже самое, только похитрей завернуто. В инстанцировании c классом Unicode выражение A x(T::foo); определяет переменную с именем x, а с классом Ansi — объявляет функцию, поскольку Ansi::foo — это тип. Одно непонятно, как во втором случае компилятор обходится без ключевого слова typename?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Можно еще немножко "углУбить" пример и посмотреть, как кретински колбасит комеау:
#include <stdio.h>
struct A {
A(...) {
printf("*");
}
// int operator ()(){return 0;} //(1)
};
template <class T> struct Main : public T
{
static void Run()
{
A x(T::foo);
x();
}
};
struct Ansi {
typedef int foo;
};
struct Unicode {
enum { foo };
};
int main()
{
Main<Ansi>::Run();
}
Здесь комо орет так:
"ComeauTest.c", line 15: error: call of an object of a class type without
appropriate operator() or conversion functions to
pointer-to-function type
x();
^
"ComeauTest.c", line 15: error: too few arguments in function call
x();
^
Т.е., похоже, он сам не определился, объект это или функция. Дальше больше, если все раскомментировать оператор (1), то ругань поменяется:
"ComeauTest.c", line 15: error: too few arguments in function call
x();
^
detected during instantiation of "void Main<T>::Run() [with T=Ansi]"
at line 29
1 error detected in the compilation of "ComeauTest.c".
Of course, the code must be complete enough to compile and link.
Впрочем, можно его и еще развить дальше. Добавить аргумент в вызов:
#include <stdio.h>
struct A {
A(...) {
printf("*");
}
int operator ()(){return 0;}
};
template <class T> struct Main : public T
{
static void Run()
{
A x(T::foo);
x(1);
}
};
struct Ansi {
typedef int foo;
};
int main()
{
Main<Ansi>::Run();
}
и тут:
"ComeauTest.c", line 15: error: no instance of function "A::operator()" matches the
argument list
The argument types that you used are: (int)
object type is: A
x(1);
^
1 error detected in the compilation of "ComeauTest.c".
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Можно еще немножко "углУбить" пример и посмотреть, как кретински колбасит комеау:
L_L>
L_L>#include <stdio.h>
L_L>struct A {
L_L> A(...) {
L_L> printf("*");
L_L> }
L_L>// int operator ()(){return 0;} //(1)
L_L>};
L_L>template <class T> struct Main : public T
L_L>{
L_L> static void Run()здесь
L_L> {
L_L> A x(T::foo);
L_L> x();
L_L> }
L_L>};
L_L>struct Ansi {
L_L> typedef int foo;
L_L>};
L_L>struct Unicode {
L_L> enum { foo };
L_L>};
L_L>int main()
L_L>{
L_L> Main<Ansi>::Run();
L_L>}
L_L>
L_L>Здесь комо орет так: L_L>
L_L>"ComeauTest.c", line 15: error: call of an object of a class type without
L_L> appropriate operator() or conversion functions to
L_L> pointer-to-function type
L_L> x();
L_L> ^
L_L>"ComeauTest.c", line 15: error: too few arguments in function call
L_L> x();
L_L> ^
Так все правильно, в случае, Main<Unicode> выражение: A x(T::foo); инстанцирется как объявление функции x, которая принимает один параметр типа T::foo, а значит и вызывать x надо с параметром типа T::foo. Причем тут есть один нюанс: если попытаться в качестве аргумента подставить значение, не зависящее от параметра шаблона (например 123), то он ругается даже при отсутствии вообще каких либо инстанцирований этого шаблона — еще на первой фазе компиляции. А вот если сделать вызов и передать в качестве параметра выражение, зависящее от параметра: x(T::foo());, то компилируется без ошибок. Причем, совершенно зря компилируется, потому, что не должно. Если попробовать написать рядышком выражение: typedef A y(T::foo);, то он сразу же одупляет, что это объявление функции и начинает требовать ключевое слово typename.
Ура! Мы нашли баг в Comeau-online!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Мне кажется, баг там есть. A x(T::foo); компилятор должен понимать однозначно — как объект. Т.е. т.к. нет typename, то T::foo это не тип. А вот что происходит, когда T::foo оказывается типом, мне непонятно. И почему он ссылается на дурацкий оператор operator () () в классе А — мне тоже непонятно. Если сделать так
#include <stdio.h>
struct A {
A(...) {
printf("*");
}
private:
int operator ()(int){return 0;}
};
template <class T> struct Main : public T
{
static void Run()
{
A x(T::foo);
x(1);
}
};
struct Ansi {
typedef int foo;
};
int main()
{
Main<Ansi>::Run();
}
То комеау вообще все нравится и он считает x — функцией с одним целочисленным параметром. А вот если убрать оператор () из класса А или поменять его сигнатуру — то тут комо опять ругается.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Мне кажется, баг там есть. A x(T::foo); компилятор должен понимать однозначно — как объект. Т.е. т.к. нет typename, то T::foo это не тип. А вот что происходит, когда T::foo оказывается типом, мне непонятно. И почему он ссылается на дурацкий оператор operator () () в классе А — мне тоже непонятно. Если сделать так
L_L>
L_L>#include <stdio.h>
L_L>struct A {
L_L> A(...) {
L_L> printf("*");
L_L> }
L_L>private:
L_L> int operator ()(int){return 0;}
L_L>};
L_L>template <class T> struct Main : public T
L_L>{
L_L> static void Run()
L_L> {
L_L> A x(T::foo);
L_L> x(1);
L_L> }
L_L>};
L_L>struct Ansi {
L_L> typedef int foo;
L_L>};
L_L>int main()
L_L>{
L_L> Main<Ansi>::Run();
L_L>}
L_L>
L_L>То комеау вообще все нравится и он считает x — функцией с одним целочисленным параметром. А вот если убрать оператор () из класса А или поменять его сигнатуру — то тут комо опять ругается.
Да нет же! Именно функция! Вот это компилируется без ошибок:
#include <stdio.h>
struct A {
A(...) {
printf("*");
}
};
template <class T> struct Main : public T
{
static void Run()
{
A x(T::foo);
typedef A Y(typename T::foo);
Y* y = x;
y(123);
}
};
struct Ansi {
typedef int foo;
};
int main()
{
Main<Ansi>::Run();
}
Это баг Comeau-online!!!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
R>Да нет же! Именно функция! Вот это компилируется без ошибок:
Я не согласен, и возможно, не прав. Как мне кажется синтаксис — вещь фиксированная. Если есть какая-то конструкция, то выбираться должно однозначно — объявление ли это объекта, или объявление функции. Ты же сам видел, без всех твоих добавленных фокусов с указателями и т.п. — комо что-то говорил про оператор ().
Of course, the code must be complete enough to compile and link.
Здравствуйте, 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 и есть...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
Кё>>Задача: объяснить блондинке разницу между двумя строчками. Главный козырь блондинки — вопрос «но почему пишется-то одинаково?» Кё>> new A<x>(0);
E>П что тут объяснять? E>UB оно UB и есть...
Здравствуйте, Кодёнок, Вы писали:
Кё>Здравствуйте, Erop, Вы писали:
Кё>>>Задача: объяснить блондинке разницу между двумя строчками. Главный козырь блондинки — вопрос «но почему пишется-то одинаково?» Кё>>> new A<x>(0);
E>>П что тут объяснять? E>>UB оно UB и есть...
Кё>С какой стати это UB?
Сравнивать указа тели на больше/меньше можно только в том случае, если они указывают на элементы одного массива, в противном случае: behavior is unspecified. Пункт стандартана на память не помню, знаю точно, что есть.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>Сравнивать указа тели на больше/меньше можно только в том случае, если они указывают на элементы одного массива, в противном случае: behavior is unspecified. Пункт стандартана на память не помню, знаю точно, что есть.
Добавьте operator new для A, который вернёт &x[0], суть примера от этого не изменится.
Здравствуйте, Кодёнок, Вы писали:
Кё>Здравствуйте, rg45, Вы писали:
R>>Сравнивать указа тели на больше/меньше можно только в том случае, если они указывают на элементы одного массива, в противном случае: behavior is unspecified. Пункт стандартана на память не помню, знаю точно, что есть.
Кё>Добавьте operator new для A, который вернёт &x[0], суть примера от этого не изменится.
С такой поправкой да, пример становится well-formed.
Удивляет другое — ты с такой заботой относишься к этому примеру — чем это объясняется?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
Кё>>Добавьте operator new для A, который вернёт &x[0], суть примера от этого не изменится.
R>С такой поправкой да, пример становится well-formed.
Она и была well-formed. Unspecified значит всего-лишь «зависит от реализации».
Здравствуйте, Кодёнок, Вы писали:
Кё>Здравствуйте, rg45, Вы писали:
Кё>>>Добавьте operator new для A, который вернёт &x[0], суть примера от этого не изменится.
R>>С такой поправкой да, пример становится well-formed.
Кё>Она и была well-formed. Unspecified значит всего-лишь «зависит от реализации».
Да, точно.
1.3.13 unspecified behavior
behavior, for a well-formed program construct and correct data, that depends on the implementation. The
implementation is not required to document which behavior occurs.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Кодёнок, Вы писали:
Кё>Добавьте operator new для A, который вернёт &x[0], суть примера от этого не изменится.
А тогда уже new будет нехороший. Так как new вызванное дважды вообще-то должно вернуть разные адреса...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, Кодёнок, Вы писали:
Кё>>Добавьте operator new для A, который вернёт &x[0], суть примера от этого не изменится. E>А тогда уже new будет нехороший. Так как new вызванное дважды вообще-то должно вернуть разные адреса...
Выход прост: к нехорошему new прийдется написать нехороший delete
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Не можешь достичь желаемого — пожелай достигнутого.