gpt4 book ai didi

c++ - 可能的编译器错误?使用从模板化静态成员函数检索的指针调用模板化方法时,无法进行自动推导

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:25:36 25 4
gpt4 key购买 nike

<分区>

更新 2

为什么这被标记为重复? Where and why do I have to put the “template” and “typename” keywords? 不回答这个问题。这里描述的行为在任何地方都没有提到(你不会在那里找到关于 auto 的预期行为的任何评论)。

不是重复,特别是因为在不同的编译器中存在冲突行为。


更新

很像 GCC,clang 也无法编译:

17 : error: expected expression
return p->is<true>();
^

但是,关于 MSVC带有 auto 的代码检测编译成功

显然,某处存在编译器错误。


Live example

考虑以下类:

struct A {
template<bool>
bool is() const {
return true;
}

template<bool>
static A* get() {
static A a;
return &a;
}
};

如果是模板函数,比如

template<bool cond>
bool foo() {
auto p = A::get<cond>();
return p->is<true>();
}

尝试调用 A::is<bool> ,它悲惨地失败了:

main.cpp: In function 'bool foo()':
main.cpp:17:24: error: expected primary-expression before ')' token
return p->is<true>();
^
main.cpp: In instantiation of 'bool foo() [with bool cond = true]':
main.cpp:21:22: required from here
main.cpp:17:17: error: invalid operands of types '<unresolved overloaded function type>' and 'bool' to binary 'operator<'
return p->is<true>();
^

但是,如果我们只替换 auto使用显式类型(A*):

template<bool cond>
bool foo() {
A* p = A::get<cond>();
return p->is<true>();
}

有效。

这是什么原因?

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