草庐IT

c++ - Clang 和 GCC 在强制转换 C++17 中的非类型模板参数的自动说明符中存在分歧

我基本上有一个依赖于非类型模板参数的类。我定义了一个转换,因此非类型模板参数N的对象可以转换为另一个M。我有一个可以重现这种情况的最小示例:templateclassTest{public:typedefdecltype(Integral)value_type;staticconstexprvalue_typeN=Integral;constexprTest(constvalue_type&x=0);templateconstexprexplicitoperatorTest()const;private:value_typen;};templateconstexprTest::Test

c++ - Clang 和 GCC 在强制转换 C++17 中的非类型模板参数的自动说明符中存在分歧

我基本上有一个依赖于非类型模板参数的类。我定义了一个转换,因此非类型模板参数N的对象可以转换为另一个M。我有一个可以重现这种情况的最小示例:templateclassTest{public:typedefdecltype(Integral)value_type;staticconstexprvalue_typeN=Integral;constexprTest(constvalue_type&x=0);templateconstexprexplicitoperatorTest()const;private:value_typen;};templateconstexprTest::Test

c++ - 可以将不同的 GCC 方言联系在一起吗?

我知道原则上这可能是未定义的行为,但为了处理大型项目,这是我关于GCC的问题:假设我用gcc-std=c++98编译一个转换单元,另一个用-std=c++11编译,使用完全相同的编译器安装.有什么保证我可以链接两个目标文件并获得一个定义明确的程序吗?据我所知,由于宏的不同,潜在的问题只能来自库头的不同View,而那些反过来最多添加新的成员函数,但绝不是成员对象,到标准库类。这是否会让使用不同语言方言选项编译大型项目的不同部分变得可以接受?更新:我应该添加一个正交问题:使用两个不同版本的GCC(比如4.3和4.6)怎么样,但相同方言选项(-std=c++98)?上市inthisGCCdo

c++ - 可以将不同的 GCC 方言联系在一起吗?

我知道原则上这可能是未定义的行为,但为了处理大型项目,这是我关于GCC的问题:假设我用gcc-std=c++98编译一个转换单元,另一个用-std=c++11编译,使用完全相同的编译器安装.有什么保证我可以链接两个目标文件并获得一个定义明确的程序吗?据我所知,由于宏的不同,潜在的问题只能来自库头的不同View,而那些反过来最多添加新的成员函数,但绝不是成员对象,到标准库类。这是否会让使用不同语言方言选项编译大型项目的不同部分变得可以接受?更新:我应该添加一个正交问题:使用两个不同版本的GCC(比如4.3和4.6)怎么样,但相同方言选项(-std=c++98)?上市inthisGCCdo

c++ - 为什么使用 gcc 在 Linux 和 Windows 上打包结构的大小会不同?

在下面的代码中,为什么在Linux和Windows下使用gcc编译时打包结构的大小不同?#include#include//id3headerfromanmp3filestructheader{uint8_tversion[2];uint8_tflags;uint32_tsize;}__attribute__((packed));intmain(intargc,char**argv){printf("%u\n",(unsignedint)sizeof(header));return0;}使用的gcc版本:$g++--versiong++(Ubuntu/Linaro4.5.2-8ubun

c++ - 为什么使用 gcc 在 Linux 和 Windows 上打包结构的大小会不同?

在下面的代码中,为什么在Linux和Windows下使用gcc编译时打包结构的大小不同?#include#include//id3headerfromanmp3filestructheader{uint8_tversion[2];uint8_tflags;uint32_tsize;}__attribute__((packed));intmain(intargc,char**argv){printf("%u\n",(unsignedint)sizeof(header));return0;}使用的gcc版本:$g++--versiong++(Ubuntu/Linaro4.5.2-8ubun

c++ - GCC 和 clang (SFINAE) 之间的重载解析行为差异

GCC接受以下代码:templatestructmeta{typedeftypenameT::typetype;};structS{};templatetypenamemeta::typefoo(T,S);intfoo(int,int);intmain(){foo(0,0);}但是clang拒绝它并出现以下错误:test.cpp:4:22:error:type'int'cannotbeusedpriorto'::'becauseithasnomemberstypedeftypenameT::typetype;^test.cpp:10:10:note:ininstantiationoft

c++ - GCC 和 clang (SFINAE) 之间的重载解析行为差异

GCC接受以下代码:templatestructmeta{typedeftypenameT::typetype;};structS{};templatetypenamemeta::typefoo(T,S);intfoo(int,int);intmain(){foo(0,0);}但是clang拒绝它并出现以下错误:test.cpp:4:22:error:type'int'cannotbeusedpriorto'::'becauseithasnomemberstypedeftypenameT::typetype;^test.cpp:10:10:note:ininstantiationoft

c++ - gcc 如何在 linux 上实现 C++ 异常的堆栈展开?

gcc如何在Linux上实现C++异常的堆栈展开?具体来说,它如何知道展开框架时要调用哪些析构函数(即存储了什么样的信息以及存储在哪里)? 最佳答案 参见x86_64ABI的第6.2节.这详细说明了界面,但没有详细说明基础数据。这也独立于C++,并且可以想象也可以用于其他目的。gcc发出的ELF二进制文件主要有两个部分用于异常处理。它们是.eh_frame和.gcc_except_table。.eh_frame遵循DWARF格式(在您使用gdb时主要发挥作用的调试格式)。它与使用-g编译时发出的.debug_frame部分具有完全相

c++ - gcc 如何在 linux 上实现 C++ 异常的堆栈展开?

gcc如何在Linux上实现C++异常的堆栈展开?具体来说,它如何知道展开框架时要调用哪些析构函数(即存储了什么样的信息以及存储在哪里)? 最佳答案 参见x86_64ABI的第6.2节.这详细说明了界面,但没有详细说明基础数据。这也独立于C++,并且可以想象也可以用于其他目的。gcc发出的ELF二进制文件主要有两个部分用于异常处理。它们是.eh_frame和.gcc_except_table。.eh_frame遵循DWARF格式(在您使用gdb时主要发挥作用的调试格式)。它与使用-g编译时发出的.debug_frame部分具有完全相