gpt4 book ai didi

c++ - 在类模板中没有定义参数的情况下调用 friend 模板函数

转载 作者:太空宇宙 更新时间:2023-11-04 13:42:45 25 4
gpt4 key购买 nike

我一直在尝试调用不带参数的模板化友元函数,该函数在类模板中定义。我没有找到确切的解决方案,而是用另一种方式解决了我的问题,但在我的实验中,我突然发现了一些有趣的代码。它有效,但我不知道为什么。这是这个例子:

#include <iostream>

template<class T> class A
{
public:
void test() const
{
std::cout << "A!" << std::endl;
}

template<class U> friend A fun()
{
return A();
}
};

int main(int argc, char* argv[])
{
A<double> aa; // 1
const auto& a = fun<int>();

a.test();

return 0;
}

正如我所说,它适用于 GCC 4.8.1。如果我删除 (1),它会失败并显示以下内容:

main.cpp: In function 'int main(int, char**)':                                                                                                                                                                     
main.cpp:20:18: error: 'fun' was not declared in this scope
const auto& a = fun<int>();
^
main.cpp:20:22: error: expected primary-expression before 'int'
const auto& a = fun<int>();

我怀疑这里有 UB,但如果有人能澄清一下,那将非常有趣:

  1. 为什么它在我没有告诉 fun() 它应该使用 A 的哪个特化的情况下仍然有效?
  2. 如果不是 UB,T 是什么类型?我尝试了 type_info,发现它既不是 int 也不是 double。 typeid().name() 没有帮助,因为它为我返回“FdvE”。

最佳答案

这似乎是一个 GCC 错误。 friend类中定义的函数模板只能通过 ADL 找到:GCC 显然考虑了 aa在 ADL 期间调用 main (无缘无故)并调用 A<double>fun ,通过这个静态断言确认:

void test() const
{
static_assert( std::is_same<T, double>::value, "" );
}

Demo .
Clang 做 not compile this code完全没有。

关于c++ - 在类模板中没有定义参数的情况下调用 friend 模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27159966/

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