gpt4 book ai didi

c++ - 无用(也许是错误的?)gcc 错误消息

转载 作者:行者123 更新时间:2023-11-30 04:36:07 28 4
gpt4 key购买 nike

我只花了几个小时调试一个编译器错误,如果编译器的错误消息更有用,我可以立即修复这个错误。

我把它简化为一个简单的例子:

template <typename T>
int f(int);

template <typename U>
auto g(U x) -> decltype(f(x));

int main()
{
g(0);
}

错误是:

test.cpp: In function 'int main()':
test.cpp:9:8: error: no matching function for call to 'g(int)'
test.cpp:9:8: note: candidate is:
test.cpp:5:29: note: template<class U> decltype (f(x)) g(U)

这个错误充其量是误导性的,最坏的情况下是完全错误的吗?在我看来,问题是 不是 g 的给定定义与调用不匹配,而是定义格式错误(因为在 decltype 的表达式 f(x) 中,它尝试在不指定 f 的模板参数的情况下调用 f)。

这样的错误信息不是更合理吗:

no matching function for call to 'f(int)' in 'decltype(f(x))'
in instantiation of 'g(U)' with U = int

甚至更好:

failed to deduce template parameter 1 in call to 'f(int)' in 'decltype(f(x))'
in instantiation of 'g(U)' with U = int

我早就料到了这样的事情......

最佳答案

您很可能会遇到 C++0x 中的“扩展 SFINAE”规则;因为对 f(x) 的调用在 g 的返回类型的实例化中不起作用(因为无法推断出 Tf 的调用),g 具有无效的返回类型,因此会静默地从重载集中删除。这是一项功能,尽管它会损害错误消息的质量,因为编译器假定 g 是您不打算调用的无关函数。在这种情况下,g 没有其他重载,因此编译器应该给出更好的消息。

有关扩展 SFINAE 的更多信息,请访问 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html .

关于c++ - 无用(也许是错误的?)gcc 错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4772208/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com