Decltype Bug Gcc无法编译

时间:2018-08-31 04:42:43

标签: c++11 gcc c++14

源代码 https://github.com/kennywakeland/Decltype-Bug/blob/master/main.cpp

测试编译 https://coliru.stacked-crooked.com/a/443f03625728f00e

此代码用于使用宏测试设置器和获取器。我想传递变量名。 decltype没有将正确的类型返回给HTestSet。知道为什么它不返回正确的值类型吗?

编译器错误     g ++ -std = c ++ 11 -O2 -Wall -pedantic -pthread main.cpp && ./a.out

main.cpp: In function 'int main()':
main.cpp:26:72: error: no matching function for call to 'HTestSet(TestClass&, void (BaseClass::*)(int), int&)'
     if(HTestSet(OBGEC_ON, &decltype(OBGEC_ON)::SET_CALL, test_vall_stor)){
                                                                        ^

main.cpp:18:1: note: in expansion of macro 'H_TEST_VALUE_GET_SET'
 H_TEST_VALUE_GET_SET(H_GET_VALUE(OBGEC_ON, VAL_NAME), \
 ^~~~~~~~~~~~~~~~~~~~

main.cpp:92:5: note: in expansion of macro 'H_TEST_VALUE'
     H_TEST_VALUE(woo, Green, 3);
     ^~~~~~~~~~~~

1 个答案:

答案 0 :(得分:0)

这不是一个bug(据我所知),与decltype无关。问题在于setGreenBaseClass的非虚拟成员函数,并且由于您没有在TestClass中重新声明该函数,因此类型为:

&TestClass::setGreen

是:

void (BaseClass::*)(int)

...因此您在模板实例化HTestSet中存在模板参数冲突。


我没有找到比[expr.unary.op#3]中的示例更好的标准报价:

  

一元&运算符的结果是指向其操作数的指针。操作数应为左值或 qualified-id 。如果操作数是 qualified-id ,其命名类型为m的某个类C的非静态成员或变体成员T,则结果的类型为“指针类型C的类T的成员,并且是表示C​::​m的prvalue。 [...]

struct A { int i; };
struct B : A { };
... &B::i ...       // has type int A​::​*

f开头使用main只行,因为在这种情况下,void (BaseClass::*)(int)可以隐式转换为void (TestClass::*)(int)[conv.mem#2]

  

类型“指向cv T类型的B的成员的指针”的prvalue(其中B是类类型)可以转换为“指向cv T类型D的成员的指针”的prvalue,其中D是B.的派生类([class.derived])。由于结果的类型为“指向cv T类型的D的成员的指针”,因此使用D对象进行间接访问是有效的。结果与使用D的B子对象通过指向B的成员的指针间接访问相同。