可以偏移与从decltype获得的结构类型一起使用吗?

时间:2015-08-27 03:57:05

标签: c++ c++11

可以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 6.0版(clang-600.0.57)下编译(基于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.

我是否想过没有测试用例作者想到的东西?

1 个答案:

答案 0 :(得分:2)

它们可以一起使用。举个例子:

#include <iostream>
#include <string>
#include <stddef.h>

int main()
{
  struct S {
   int a;
   int b;
  };
  S instance;
  std::cout << "offset: " << offsetof(decltype(instance), b) << "\n";
  return 0;
}

打印偏移量:4

我认为你的问题源于使用decltype(* this),根据C ++ 11标准的5.1.1,我不确定你会做什么。