【问题标题】:decltype and member function (not pointer) typedecltype 和成员函数(不是指针)类型
【发布时间】:2012-07-06 11:28:17
【问题描述】:
struct C
{
    int Foo(int i) { return i; }

    typedef decltype(C::Foo) type;
};

由于没有像成员函数类型这样的类型(没有,是吗?),我希望C::typeint (int)

但以下内容无法使用 Visual C++ 2012 RC 进行编译:

std::function<C::type> f;

那么decltype(C::Foo)是什么类型?

【问题讨论】:

  • 当我需要询问“ 是什么类型”时,我会使用类似的方法来哄骗编译器为我打印类型 struct{}_ = &lt;expression&gt;;。通常适用于 GCC。

标签: c++ visual-c++ c++11 decltype visual-c++-2012


【解决方案1】:

代码格式不正确:成员函数名(例如C::Foo)的使用方式只有几种,而这不是其中之一(有效使用的完整列表可以在C++ 语言标准,参见 C++11 §5.1.1/12)。

在您的示例上下文中,您唯一能做的就是获取成员函数的地址&amp;C::Foo,以形成指向int (C::*)(int) 类型的成员函数的指针。

由于代码格式错误,编译器应该拒绝它。此外,根据C::Foo 的使用方式,它会产生不一致的结果;我们将看看下面的不一致。

请在Microsoft Connect 上报告错误。或者,请告诉我,我很乐意报告此问题。


如果你有一个类型但你不知道它是什么类型,你可以通过使用它来找出类型的名称,这会导致编译器发出错误。例如,声明一个类模板并且从不定义它:

template <typename T>
struct tell_me_the_type;

然后,你可以用你感兴趣的类型实例化这个模板:

tell_me_the_type<decltype(C::Foo)> x;

由于tell_me_the_type尚未定义,x的定义无效。编译器应该在它发出的错误中包含T 类型。 Visual C++ 2012 RC 报告:

error C2079: 'x' uses undefined struct 'tell_me_the_type_name<T>'
with
[
    T=int (int)
]

编译器认为C::Fooint (int) 类型。如果是这种情况,那么编译器应该接受以下代码:

template <typename T>
struct is_the_type_right;

template <>
struct is_the_type_right<int(int)> { };

is_the_type_right<decltype(C::Foo)> x;

编译器不接受此代码。它报告以下错误:

error C2079: 'x' uses undefined struct 'is_the_type_right<T>'
with
[
    T=int (int)
]

所以,C::Foo 都是 int (int) 类型,而不是 int (int) 类型,这违反了 principle of noncontradiction。 :-)

【讨论】:

  • 揭示所谓类型的绝妙方法。您是否亲自向编译器团队提交错误报告?
  • @James 谢谢。你能报告这个吗?我不知道如何表达这个问题。
  • 其实我相信第一部分是错误的。 AFAIK,decltype(expr) 不计算表达式,这意味着它属于最后一类:如果该 id 表达式表示非静态数据成员并且它出现在未计算的操作数中。
  • @DavidRodríguez-dribeas: C++11 §5.1.1/10,在答案中引用,指出:“一个表示非静态数据的 id-expression类的成员或非静态成员函数只能使用...”,后面是允许使用的列表。用作decltype 的操作数不在列表中。
  • @DavidRodríguez-dribeas: C::foo 不表示非静态数据成员,。它表示一个非静态成员函数。
【解决方案2】:

那么decltype(C::Foo)是什么类型?

它不是类型,因为只使用 C::Foo 是不正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-27
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 2018-09-12
    相关资源
    最近更新 更多