vol*_*evo 6 c++ templates types metaprogramming function
我真正开始探索C++的不寻常角落.从这个问题中了解了函数的真实类型而不是函数指针,我尝试了解函数类型,并提出了这个奇怪的案例:
typedef int Func(int);
int Foo(int x) { return 1; }
int main()
{
    const Func*& f = &Foo;
    return 0;
}
既然&Foo是一个rvalue类型Func*,我想我应该能够把它放在一个const引用中,但是我从g ++ 4.6中得到了这个错误:
funcTypes.cpp: In function ‘int main()’:
funcTypes.cpp:7:23: error: invalid initialization of non-const reference of type ‘int (*&)(int)’ from an rvalue of type ‘int (*)(int)’
但是f 是常量!对我来说很明显,简单地忽略了const对函数(或对指针等的引用/引用)的应用; 这段代码编译得很好:
template <typename A, typename B>
struct SameType;
template <typename A>
struct SameType<A, A> { };
typedef int Func(int);
int main()
{
    SameType<const Func, Func>();
    return 0;
}
我猜这是促进拉动他们的is_function类型特征,但我的问题是 - 为什么C++通过忽略它而不是禁止它来允许它?
编辑:我现在意识到在第一个例子f中是非const,并且const FuncPtr& f = &Foo确实有效.然而,这只是背景,真正的问题是上面的问题.
&Foo是一个指针。一般来说,我建议避免引用指针(const或不引用)。至少,除非你知道自己在做什么。
所以你应该有:
const Func *f = &Foo;
或者说真的,你可以完全放弃const:
Func *f = &Foo;
为什么 C++ 通过忽略而不是禁止来允许这种情况?
因为你在谈论两件不同的事情。
在 C++ 中,函数类型和函数指针之间存在区别。Foo是一种函数类型,具体来说int(int). &Foo是一个函数指针,类型为int(*)(int)。必要时,函数类型会降级为函数指针(就像数组类型降级为指针一样)。但它们是不同的(就像数组一样)。
所以你的两个案例并不相同。第一种情况是处理函数指针,第二种情况是处理函数类型(这就是模板参数推导的类型)。
至于为什么函数类型会吞掉const,那是因为函数类型的值已经是隐式常量了。你无法改变它们。您可以对函数类型执行的唯一操作是()(或转换为函数指针)。所以 aconst T相当于TifT是一个函数类型。Visual Studio 2010 实际上对此发出了警告。
| 归档时间: | 
 | 
| 查看次数: | 674 次 | 
| 最近记录: |