gpt4 book ai didi

c++ - offsetof 可以与从 decltype 获得的结构类型一起使用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:44 24 4
gpt4 key购买 nike

offsetof 可以与通过 decltype 获得的类型一起使用吗?这些情况中的任何一个都适用于 C++11 吗?

struct S {
int i;
int j { offsetof(decltype(*this), i) }; // case 1
S() : i(offsetof(decltype(*this), j)) {}; // case 2
} inst1;

int main() {
struct {
int i;
int j { offsetof(decltype(*this), i) }; // case 3
} inst2;
return 0;
}

在 Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) 下均无法编译,报错

error: offsetof requires struct, union, or class type, 
'decltype(*this)' (aka '<anonymous struct at ../qxjs3uu/main.cpp:4:4> &') invalid

它似乎还使 MSVC 19.00.23106.0(x86) 崩溃并出现内部错误:

Compiled with  /EHsc /nologo /W4 /c
main.cpp
main.cpp(3): error C2062: type 'S &' unexpected
[...]
main.cpp(4): fatal error C1903: unable to recover from previous error(s); stopping compilation
Internal Compiler Error in c:\tools_root\cl\bin\i386\cl.exe. You will be prompted to send an error report to Microsoft later.

我是否想到了测试用例编写者没有想到的东西?

最佳答案

取消引用指针的结果是一个左值(并且它本身是一个表达式),因此 decltype(*this) 为您提供 S& 类型:

§ 7.1.6.2 [dcl.type.simple]/p4:

The type denoted by decltype(e) is defined as follows:

— [...]

— otherwise, if e is an lvalue, decltype(e) is T&, where T is the type of e;

要将它用作 offsetof 的参数,您需要从从 decltype() 说明符获得的类型中删除引用:

offsetof(std::remove_reference<decltype(*this)>::type, i)

DEMO

关于c++ - offsetof 可以与从 decltype 获得的结构类型一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32240444/

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