错误、漏洞、问题 - 页 1569

 
Ruslan Khasanov:
为什么在使用定型器时,会出现 "垃圾"?
而你为什么要使用它呢?))
 

译错误(构建1327)。

class A { 
public:
        bool operator++( int ) { return false; }
};

void OnStart()
{
        A a;
        while ( a++ ); //'++' - illegal operation use
}
 

编译错误

class A { public:
template<typename T>        void f( T t );
template<typename T> static void g( T t );
}; 
template<typename T> void A::f( T t ) {}
template<typename T> void A::g( T t ) {}

void OnStart()
{
        A a;
        a.f(  1 ); //нормально
        A::g( 1 ); //'g<int>' - access to non-static member or function
}
 

编译错误

class A { public:
        A *operator ++()      { return &this; }
};
template<typename T> void f( T t ) {}
void g( A *a )
{
        f( ++a ); //'A' - declaration without type (1)
        f( a.operator++()); //нормально            (2)
}
特别注意--如果你把(!)行(1)和(2)调换一下就好了,这需要额外的检查
 
A100:

编译错误

我想特别指出,如果你把(!)行(1)和(2)对调,一切都很好,这需要额外检查
在你的例子中,f(++a)和f(a++)导致f的不同变体,我的理解是否正确?
 
Anton Zverev:
我是否正确地理解了f(++a)和f(a++)在你的样本中造成f的不同变体?

不,这是一个编译错误--即还没有到执行的时候(具体调用)。从代码的角度来看,字符串(1)和(2)是等价的(对同一事物的不同书写)。

下面是另一个例子,这样我就不会觉得这只是关于++运算符的问题了。

class A { public:
        A *operator <<( int )      { return &this; }
};
template<typename T> void f( T* t ) {}
void g( A* a )
{
        f( a << 1 ); //'A' - declaration without type
}
 
A100:

第(1)行和第(2)行在代码方面是等同的(同一事物的不同写法)。

不过,++a和a++在意义上是不同的。你不觉得吗?
 
Anton Zverev:
++a和a++毕竟在意义上是不同的。你不觉得吗?
没有A++
 

编译错误: 树形优化错误

#property library

class A { public:
template<typename T> int f( T a, int b, bool c = false );
};
template<typename T>
int A::f( T a, int b, bool c ) { return 0; }

class B : public A {
        virtual void g();
};
void B::g()
{
        f( 0, 0, false ); //нормально
        f( 0, 0 );        //tree optimization error
}

class C {};
void start( C* ) export {}

由于"树状优化错误 "不容易定位,我要求开发人员(如果他们有这种可能性)将所有的优化放到优化键中(感谢上帝,它存在),否则即使禁用了优化,工作程序在构建升级后也会变成完全禁用(而且不可能恢复)

请注意,今天所有的错误都不是旧的,而是新的--在之前 (Build 1241),一切都正常
 
A100:
没有A++

对。这就是为什么我把它说得更具体。

安东-兹维列夫
在你的例子中,f(++a)和f(a++) 造成f的不同变体,我的理解是否正确?