【问题标题】:sizeof and function template: sizeof(&f) vs sizeof(&f<int>)sizeof 和函数模板:sizeof(&f) 与 sizeof(&f<int>)
【发布时间】:2016-09-04 17:42:35
【问题描述】:

正如[5.3.3/3] 所述(expr.sizeof,工作草案):

sizeof 运算符可以应用于指向函数的指针,但不能直接应用于函数。

以下最小的工作示例编译良好:

void f() { }

int main() {
    sizeof(&f);
}

我希望下面的那个也可以工作:

template<typename T>
void f() { }

int main() {
    sizeof(&f<int>);
}

无论如何,即使它使用 clang (v3.8) 编译,它也不使用 GCC (v6.1)。
错误是:

错误:没有上下文类型信息的重载函数地址

我怀疑这是 GCC 的错误(如果确认,我会开票)。
我是对的还是我在这里遗漏了一些东西,而 GCC 确实是对的?


同时,我向 GCC 开放了an issue。

【问题讨论】:

  • 这是一个错误。3210
  • @Columbo 是 3210 的错误参考还是诺基亚手机的 amarcord 提及? :-)
  • 我对荒谬的最小评论长度感到恼火。 ;D
  • @Columbo Ahahah... Touché。确实是最好的理由!!对不起这个愚蠢的问题,这太明显了。 ;-)
  • @DanielJour 我刚刚报告了它...没有找到错误,但我不是最好的 bugzilla 搜索引擎。

标签: c++ templates gcc clang language-lawyer


【解决方案1】:

这是一个错误。以下代码编译正常:

template<typename T>
void f() { }

int main() {
    auto fptr = &f<int>;
    return sizeof(fptr);
}

请注意,起初我没有仔细阅读这个问题。我的印象是f&lt;int&gt;这个函数确实重载了,例如:

template<typename T>
void f() { }

template<typename T>
void f(T) { }

int main() {
    sizeof(&f<int>);
}

在这样的阅读问题下,我准备了以下答案,我仍然想与社区分享:


我不认为它是一个错误。

将其限定为错误的参数如下 - 所有函数指针具有相同的大小,那么sizeof 运算符中的哪个函数意味着什么很重要?

我要推翻那个论点。

首先,它是从错误的前提开始的。 C++ 标准只保证

将“指向T1”类型的纯右值转换为“指向T1”类型的纯右值 T2”(其中T1 和T2 是函数类型)并返回其原始类型会产生原始指针值

这并不一定意味着指向不同类型函数的指针的大小是相同的。但我承认,在实践中确实如此。

接下来,即使我们接受了论证背后的前提和逻辑,那么我们也必须接受以下程序也应该毫无问题地编译的主张:

template<typename T>
void f() { }

template<typename T>
void f(T) { }

int main() {
    auto fptr = &f<int>;
    return sizeof(fptr);
    // fptr is not used anywhere else, so the compiler must not
    // whine about the ambiguity on its declaration line
}

继续以这种方式,我们认为编译歧义绝不应该被报告,只要它们被后续代码消除。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-02-19
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 2017-03-26
相关资源
最近更新 更多