错误、漏洞、问题 - 页 2006

 
fxsaber:

为什么两者都要编译?

一般来说,我很少使用模板--我没有详细说明--我只能在直观的层面上进行解释

在第二种情况下,将T直接替换为A*可以很好地编译--所以模板也应该可以编译了

class A {};
void f( A * const ) {}
void OnStart()
{
        A *a;
        f( a ); //нормально
}

在第一种情况下,直接替换不起作用,但你可以添加多余的参数T2--有它就能正常编译--没有它也应该这样--这就是为什么它是多余的。

template<typename T, typename T2>
void f( T, const T2 ) {}
class A {};
void OnStart()
{
        const A *a;
        f( a, a ); //нормально
}
 
A100:

直观地说,const有时是一个类型的一部分,有时只是一个标识符,那在函数里面的指针将是const。

这可以通过Print(__FUNCSIG__)来感受。

 
优化表中的缩减值显示得很奇怪。它显示了最大的缩减手段(但它写成了百分比)。但在一次测试后发现,相对缩水与最大缩水不同(百分比较大或较小)。在使用资金管理时,是否有必要添加一些东西来显示所需的结果?
 
A100:

编译错误

template<typename T>
void f( T, const T ) {}
class A {};
void OnStart()
{
        A * const a = new A;
        f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
这就是它的编译方式,原始版本不应该如此。
 
Комбинатор:
这就是它的编译方式,原版应该不是。

为什么?

template<typename T>
struct B {
        void f( T, const T ) {}
};
class A {};
void OnStart()
{
          const A* a;
        B<const A*> b;
        b.f( a, a ); //нормально
}

所以这很好。原则上有什么变化?

template<typename T>
        void f( T, const T ) {}
class A {};
void OnStart()
{
          const A *a;
          f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
 
A100:

什么东西发生了根本性的变化?

差异是巨大的!这就是你打电话来的原因。

void B<const A*>::f(const A*,const A*)
编译器的错误在于它无法找出模板的正确版本。显然是告诉它的。
template<typename T>
        void f( T, const T ) {}
class A {};
void OnStart()
{
          const A *a;
          f<const A*>( a, a );
}

而且它正在发挥作用。

 
fxsaber:
而且它正在发挥作用。

为什么要多出这些字符?

 
A100:

为什么要多出这些字符?

为了表明编译器并没有猜测到模式的完全可行的版本。

 
fxsaber:

为了表明编译器并没有猜测到模式的完全可行的版本。

为什么要这样呢?ServiceDesk可以自己解决这个问题

 
A100:

为什么?

根据你的专业判断,该类型应该是被抛弃的,它确实如此。如果你明确指定了正确的类型,当然就能编译了。