VC++ 8.0 и Template definition non-dependent names lookup
От: igna Россия  
Дата: 16.07.06 08:23
Оценка: 3 (2)
Похоже, что VC++ 8.0 неверно компилирует пример из стандарта:

14.6.3 Non-dependent names [temp.nondep]

1 Non-dependent names used in a template definition are found using the usual name lookup and bound at the
point they are used. [Example:

    void g(double);
    void h();

    template<class T> class Z {
    public:
        void f() {
            g(1);                           // calls g(double)
            h++;                           // ill-formed: cannot increment function;
                                              // this could be diagnosed either here or
                                              // at the point of instantiation
        }
    };

    void g(int);                          // not in scope at the point of the template
                                              // definition, not considered for the call g(1)


—end example]


Я модифицировал этот пример так:

#include <iostream>

void g(double) { std::cout << "void g(double);\n"; }

template<class T> class Z {
public:
    void f() { g(1); }
};

void g(int) { std::cout << "void g(int);\n"; }

int main()
{
    Z<int> z;
    z.f();
}


и получил как результат исполнения:

void g(int);

Вроде бы при тестировании компилятора работниками Microsoft примеры из стандарта должны были быть опробованными не в последнюю очередь. Потому может быть поведение VC++ 8.0 в данном случае вовсе не ошибка, а намеренное отклонение от стандарта, например для соответствия предполагаемому изменению стандарта в будущем?
Re: VC++ 8.0 и Template definition non-dependent names looku
От: Павел Кузнецов  
Дата: 16.07.06 09:12
Оценка: 8 (2)
igna,

> Похоже, что VC++ 8.0 неверно компилирует пример из стандарта:


Да, VC++8 не поддерживает two phase name lookup.

> Вроде бы при тестировании компилятора работниками Microsoft примеры из стандарта должны были быть опробованными не в последнюю очередь. Потому может быть поведение VC++ 8.0 в данном случае вовсе не ошибка, а намеренное отклонение от стандарта, например для соответствия предполагаемому изменению стандарта в будущем?


И ошибка, и, в некотором роде, позиция, заключающаяся в том, что поведение VC++, с их точки зрения, логичнее стандартного, соответственно, приоритет ошибки при учете высокой цены исправления низкий. Т.е. и на Orcas, насколько я знаю, планов исправлять это нет.
Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: VC++ 8.0 и Template definition non-dependent names lo
От: Warturtle  
Дата: 16.07.06 09:53
Оценка: 13 (3)
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>igna,


>> Похоже, что VC++ 8.0 неверно компилирует пример из стандарта:


ПК>Да, VC++8 не поддерживает two phase name lookup.


>> Вроде бы при тестировании компилятора работниками Microsoft примеры из стандарта должны были быть опробованными не в последнюю очередь. Потому может быть поведение VC++ 8.0 в данном случае вовсе не ошибка, а намеренное отклонение от стандарта, например для соответствия предполагаемому изменению стандарта в будущем?


ПК>И ошибка, и, в некотором роде, позиция, заключающаяся в том, что поведение VC++, с их точки зрения, логичнее стандартного, соответственно, приоритет ошибки при учете высокой цены исправления низкий. Т.е. и на Orcas, насколько я знаю, планов исправлять это нет.


В подтверждение, выдержка из интервью

Host: Herb (Microsoft)
Q: What are current plans as far as becoming compliant wrt two-phase name lookup?

A: That's one of the three things we didn't implement in Everett (the others were enforcing exception specifications and export). Two-phase lookup is related to export, so see also the export answer above. One issue with two-phase lookup is that when we (or any compiler) provide(s) it, we'll have to consider migration for users -- two-phase lookup breaks a LOT of existing code, which is one reason it is not widely implemented in compilers today. (IIRC, EDG supports it in strict mode, Metrowerks supports it but you need to throw -iso_templates on (even -ansi strict isn't enough), and IBM used to support it as an option but no longer does (even as an option). The MW and IBM situations are because of breaking code.) (BTW, I don't know of any other compiler besides those three that does/did support 2-phase lookup. Did I miss any?)

Re[3]: VC++ 8.0 и Template definition non-dependent names lo
От: Павел Кузнецов  
Дата: 16.07.06 17:45
Оценка:
Здравствуйте, Warturtle, Вы писали:

W>В подтверждение, выдержка из интервью


W>

W>Host: Herb (Microsoft)
W>Q: What are current plans as far as becoming compliant wrt two-phase name lookup?

W>A: <...> (IIRC, EDG supports it in strict mode, Metrowerks supports it but you need to throw -iso_templates on (even -ansi strict isn't enough), and IBM used to support it as an option but no longer does (even as an option). The MW and IBM situations are because of breaking code.) (BTW, I don't know of any other compiler besides those three that does/did support 2-phase lookup. Did I miss any?)


Yes, he did. GCC. И EDG + GCC -- это вполне ощутимая доля рынка.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: VC++ 8.0 и Template definition non-dependent names lo
От: Warturtle  
Дата: 17.07.06 14:31
Оценка: +1
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, Warturtle, Вы писали:


W>>В подтверждение, выдержка из интервью


W>>

W>>Host: Herb (Microsoft)
W>>Q: What are current plans as far as becoming compliant wrt two-phase name lookup?

W>>A: <...> (IIRC, EDG supports it in strict mode, Metrowerks supports it but you need to throw -iso_templates on (even -ansi strict isn't enough), and IBM used to support it as an option but no longer does (even as an option). The MW and IBM situations are because of breaking code.) (BTW, I don't know of any other compiler besides those three that does/did support 2-phase lookup. Did I miss any?)


ПК>Yes, he did. GCC. И EDG + GCC -- это вполне ощутимая доля рынка.


Ну справедливости ради надо отметить, что на тот момент в g++ этого еще не было: интервью датируется 27 февраля 2003 года, а gcc 3.4 вышел в апреле 2004.
Re[5]: VC++ 8.0 и Template definition non-dependent names lo
От: igna Россия  
Дата: 17.07.06 18:13
Оценка:
Здравствуйте, Warturtle, Вы писали:

W>Здравствуйте, Павел Кузнецов, Вы писали:


. . .

Warturtle и Павел Кузнецов, скажите пожалуйста, почему сие
Автор: Lorenzo_LAMAS
Дата: 12.07.06
в VC++ 8.0 не работает? Ведь отсутствие двухфазного поиска должно было бы приводить к тому, что компилировалось бы не только вышеупомянутое сие, но и вот такое:

#include <utility>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

template <typename Ch, typename Tr>
inline basic_ostream<Ch, Tr>& operator<<(basic_ostream<Ch, Tr>& out, pair<int, int> const& x)
{
    return out << '(' << x.first << ',' << x.second << ')';
}

int main()
{
    vector<pair<int, int> > v;
    copy(v.begin(), v.end(), ostream_iterator<pair<int, int> >(cout, "\n"));
}


Ан нет...
Re[4]: VC++ 8.0 и Template definition non-dependent names lo
От: Lorenzo_LAMAS  
Дата: 18.07.06 10:08
Оценка:
ПК>Yes, he did. GCC. И EDG + GCC -- это вполне ощутимая доля рынка.

Насколько я знаю, gcc, даже самый новый, содержит ошибки в его реализации.
Of course, the code must be complete enough to compile and link.
Re[6]: VC++ 8.0 и Template definition non-dependent names lo
От: Lorenzo_LAMAS  
Дата: 18.07.06 10:09
Оценка:
I>Warturtle и Павел Кузнецов, скажите пожалуйста, почему сие
Автор: Lorenzo_LAMAS
Дата: 12.07.06
в VC++ 8.0 не работает? Ведь отсутствие двухфазного поиска должно было бы приводить к тому, что компилировалось бы не только вышеупомянутое сие, но и вот такое:



Офффтоп — а он у них отсутствует, но как-то по-хитрому
Of course, the code must be complete enough to compile and link.
Re[6]: VC++ 8.0 и Template definition non-dependent names lo
От: Warturtle  
Дата: 18.07.06 13:52
Оценка: 3 (1)
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Warturtle, Вы писали:


W>>Здравствуйте, Павел Кузнецов, Вы писали:


I>. . .


I>Warturtle и Павел Кузнецов, скажите пожалуйста, почему сие
Автор: Lorenzo_LAMAS
Дата: 12.07.06
в VC++ 8.0 не работает? Ведь отсутствие двухфазного поиска должно было бы приводить к тому, что компилировалось бы не только вышеупомянутое сие, но и вот такое:


I>
I>#include <utility>
I>#include <iostream>
I>#include <algorithm>
I>#include <vector>

I>using namespace std;

I>template <typename Ch, typename Tr>
I>inline basic_ostream<Ch, Tr>& operator<<(basic_ostream<Ch, Tr>& out, pair<int, int> const& x)
I>{
I>    return out << '(' << x.first << ',' << x.second << ')';
I>}

I>int main()
I>{
I>    vector<pair<int, int> > v;
I>    copy(v.begin(), v.end(), ostream_iterator<pair<int, int> >(cout, "\n"));
I>}
I>


I>Ан нет...


Если я правильно понимаю (в чем, признаться, не вполне уверен=) ), то это пример компилируется или нет, не из-за наличия/отсутствия двухфазного поиска имен, а из-за наличия argument dependent lookup (и такие примеры уже много раз обсуждались на rsdn'е). Если нету двухфазного поиска то на первой (и последней) фазе обламывается уже этот самый ADL — разве нет? А вот так работает:

#include <utility>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

template< class T >
struct Wrap : public T
{
  Wrap(T const &val) : T(val) {}
};

template <typename Ch, typename Tr>
inline basic_ostream<Ch, Tr>& operator<<(basic_ostream<Ch, Tr >& out, pair<int, int> const& x)
{
    return out << '(' << x.first << ',' << x.second << ')';
}

int main()
{
    vector<pair<int, int> > v(2);
    v[0] = make_pair(0, 0);
    v[1] = make_pair(1, 1);
    copy(v.begin(), v.end(), ostream_iterator< Wrap< pair<int, int> > >(cout, "\n"));
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.