Код: Выделить всё
struct BaseT
{
};
struct DerivedT: public BaseT
{
};
struct TestT
{
DerivedT testMem;
typedef BaseT (TestT::* TestTMemPtr);
constexpr TestT() = default;
static constexpr TestTMemPtr testMemOffset()
{
return &TestT::testMem;
}
};
int main()
{
constexpr TestT test;
}
< /code>
Я не могу вернуть члена по указателю в качестве члена указателя к базе, я получаю это с Clang: < /p>
cannot initialize return object of type 'TestT::TestTMemPtr' (aka 'BaseT (TestT::*)') with an rvalue of type 'DerivedT TestT::*'
< /code>
Я проверил его с помощью GCC: < /p>
error: invalid conversion from 'DerivedT TestT::*' to 'TestT::TestTMemPtr' {aka 'BaseT TestT::*'}
< /code>
Это нормальное поведение? Я думал, что всегда могу использовать полученный указатель в качестве базового указателя.
[b] Обновление [/b]:
ok, исходный пример не был лучшим, я думаю, что это более выразительно, поэтому defivedt* может использоваться в качестве основания*, но defivedt testt ::* не может быть использован в качестве базисового тестирования::::*code>: presttt step ::*
{
};
struct DerivedT: public BaseT
{
};
struct TestT
{
DerivedT m_test;
};
using BaseTMemPtr = BaseT TestT::*;
int main()
{
TestT test;
BaseT* simplePtr = &test.m_test; //It is DerivedT*, but can be used as BaseT*
BaseT (TestT::*memPtr) = &TestT::m_test; //Error, BaseT TestT::* cannot be used as DerivedT TestT::*
BaseTMemPtr memPtr2 = &TestT::m_test; //Error, just the same
}
Подробнее здесь: https://stackoverflow.com/questions/695 ... mber-error