Clang抱怨POD类实际上是非POD的
Clang complains that a POD class is actually non-POD
update:我在这里修改了代码,以便您可以直接插入它并尝试编译。
Clang 3.4.1 (LLVM 3.4) 抱怨我的类在用于可变参数函数时不是 POD 类型(据我所知肯定是)。G++编译这个没有问题。
即使按照 C++03 的标准,这个类也是 POD:
- 它仅包含 PODS 作为成员
- 没有用户定义的析构函数
- 没有用户定义的复制赋值运算符
- 没有指向成员类型的非静态成员
C++11对什么是"POD"的规则放宽了,那么这是怎么回事呢?
关于代码:这是一个矢量的模板类(如矢量图形),可变参数函数仅用于用一些任意数据填充数组。
我的类头文件:
template<typename TYPE>
class Vec3t;
typedef Vec3t<float> Vec3f;
template<typename TYPE>
class Vec3t {
public:
Vec3t<TYPE>( void ){}
Vec3t<TYPE>( const TYPE nx, const TYPE ny, const TYPE nz ){}
Vec3t<TYPE> operator-(void) const{}
Vec3t<TYPE> operator*( const Vec3t<TYPE> &other ) const{}
Vec3t<TYPE> operator*( const TYPE val ) const{}
Vec3t<TYPE>& operator*=( const Vec3t<TYPE> &other ){}
Vec3t<TYPE>& operator*=( const TYPE val ){}
Vec3t<TYPE> operator+( const Vec3t<TYPE> &other ) const{}
Vec3t<TYPE> operator+( const TYPE val ) const{}
Vec3t<TYPE>& operator+=( const Vec3t<TYPE> &other ){}
Vec3t<TYPE>& operator+=( const TYPE val ){}
Vec3t<TYPE> operator-( const Vec3t<TYPE> &other ) const{}
Vec3t<TYPE> operator-( const TYPE val ) const{}
Vec3t<TYPE>& operator-=( const Vec3t<TYPE> &other ){}
Vec3t<TYPE>& operator-=( const TYPE val ){}
Vec3t<TYPE> operator/( const Vec3t<TYPE> &other ) const{}
Vec3t<TYPE> operator/( const TYPE val ) const{}
Vec3t<TYPE>& operator/=( const TYPE val ){}
Vec3t<TYPE>& operator/=( const Vec3t<TYPE> &other ){}
bool operator==( const Vec3t<TYPE> &b ) const {}
bool operator==( const TYPE b ) const {}
bool operator!=( const Vec3t<TYPE> &b ) const {}
bool operator!=( const TYPE b ) const {}
Vec3t<TYPE>& Set( const TYPE a, const TYPE b, const TYPE c ){}
Vec3t<TYPE>& Set( const TYPE a, const TYPE b ){}
void Cross( const Vec3t<TYPE> &other, Vec3t<TYPE> &out ) const{}
TYPE Dot( const Vec3t<TYPE> &other ) const{}
Vec3t<TYPE> PerpCCW_ZAxis( void ){}
Vec3t<TYPE> PerpCW_ZAxis( void ){}
float Len( void ) const{}
void Zero( void ){}
static void Cross( const Vec3t<TYPE> &other, const Vec3t<TYPE> &u, Vec3t<TYPE> &out ){}
Vec3f Normalize( void ){}
Vec3f Rotation( TYPE angle ){}
float DegreesBetween( const Vec3f &other ){}
float RadiansBetween( const Vec3f &other ){}
Vec3f Rotate( float angle, const bool inRadians = false ){}
static float Len( const Vec3f &other ){}
public:
TYPE x,y,z;
};
template< typename TYPE >
void FillArray( const std::size_t count, TYPE* var, ... ) {
va_list vargs;
va_start( vargs, var );
for ( std::size_t i=0; i<count; i++ ) {
var[i] = va_arg( vargs, TYPE ); // ** THIS IS THE LINE CLANG ERRS ON ** //
}
va_end( vargs );
}
我的可变参数函数头文件:
#include <cstdarg>
template< typename TYPE >
void FillArray( const std::size_t count, TYPE* var, ... ) {
va_list vargs;
va_start( vargs, var );
for ( std::size_t i=0; i<count; i++ ) {
var[i] = va_arg( vargs, TYPE ); // ** THIS IS THE LINE CLANG ERRS ON ** //
}
va_end( vargs );
}
叮叮当当的错误: 错误:'va_arg' 的第二个参数是非 POD 类型 'Vec3t' [-Wnon-pod-varargs]
使用这些程序的示例程序会导致 Clang 中的错误: #include "fillarray.h"
int main ( void ) {
Vec3t<float> v[2];
FillArray< Vec3t<float> >( 2, v, 0.4f, 0.5f);
}
编译方式: clang++ x.cpp -I/usr/include/i386-linux-gnu/c++/4.8 -std=gnu++11
§12.1/7:
如果默认构造函数不是用户提供的,并且
...否则,默认构造函数是非平凡的。
根据定义,您声明的默认构造函数非常重要。
§9/3:
普通类是具有普通默认构造函数 (12.1) 并且可简单复制的类。
由于默认构造函数是非平凡的,因此类不是平凡的。
§9/10:
POD 结构是一个非联合类,它既是一个普通类,也是一个标准布局类......
由于该类不是微不足道的,因此它不符合 POD 的条件。 为了使它成为POD,你必须摆脱默认的构造函数。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 如何在 malloc 内存中初始化非 POD 数据
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- 带有 char[] 字段的 POD 结构的 constexpr 构造
- NVCC 错误:string_view.h:constexpr 函数返回是非常量
- 编译器是否必须始终删除 try-catch 块(如果它被证明是非抛出的)
- C++ 电话号码字母拨号程序 - 语法错别字?还是非 ASCII 字符?
- 非 POD 的零初始化
- C++定义构造函数使对象成为非 POD
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- 什么是非营利组织???我的问题是我不明白为什么有人会使用它
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 具有非 POD 对象的 GLib 异步队列
- 约束类模板函数以接受特定的 POD 类型
- const T{};works,const T;当T是非POD时失败
- Clang抱怨POD类实际上是非POD的