【发布时间】:2019-08-05 15:17:33
【问题描述】:
Clang,GCC,MSVC对成员函数的转换有不同的看法。 谁是对的?
https://gcc.godbolt.org/z/QNsgwd
template<typename T>
struct a
{
template <typename... Args>
void va(Args...) {}
template <typename X>
void x(X) {}
void y(int) {}
};
struct b : a<b>
{
void testva()
{
using F = void (a<b>::*)();
F f = (F)&a<b>::va<int>; // gcc: error, msvc: error, clang: ok
}
void testx()
{
using F = void (a<b>::*)();
F f = (F)&a<b>::x<int>;// gcc: error, msvc: ok, clang: ok
}
void testy()
{
using F = void (a<b>::*)();
F f = (F)& a<b>::y; // gcc: ok, msvc: ok, clang: ok
}
};
【问题讨论】:
-
在您的问题中包含编译器错误。
-
无法转换函数。您是指来自 gcc.godbolt 的完整日志吗?
-
它不需要是完整的日志,但包括编译器错误的错误消息(和以下信息行)。
-
F是一个指向不带参数的成员函数的指针。va<int>接受一个参数。X<int>也是如此。因为什么时候可以将指向带有一个参数的函数的指针转换为指向另一个不带参数的函数的指针,无论它们是常规函数还是类方法?这种转换不应该起作用。y也接受一个int参数。这种转换也不应该起作用。但是在那里有一个明确的演员呢...... -
为什么不应该是 UB?如果将带参数的函数转换为不带参数的函数是否合法,我也很感兴趣。也将寻找答案)