簡體   English   中英

Clang抱怨說POD類實際上是非POD

[英]Clang complains that a POD class is actually non-POD

更新:我已經在這里修改了代碼,以便您可以直接將其插入並嘗試編譯。

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:

如果默認構造函數不是由用戶提供的,則它是微不足道的。

否則,默認構造函數為non-trivial

根據定義,您已聲明的默認構造函數很重要。

§9/ 3:

普通類是具有普通默認構造函數(12.1)且可普通復制的類。

由於默認構造函數不是平凡的,所以該類也不是平凡的。

第9/10條:

POD結構是一個非聯合類,既是一個瑣碎的類又是一個標准布局的類...

由於該課程並不簡單,因此不符合POD的資格。 為了使其成為POD,您必須擺脫默認的構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM