2

私はオープンソースプログラムを維持していますが、ユーザーの1人が、これまで使用したことのないでコンパイルされないと報告しclangました。私が得ているエラーの1つは、*警告:関数型'junky_t'(別名'void(const int&、const int&)')の修飾子の動作が指定されていないことです。*。この問題を示す小さなプログラムを作成しました。

typedef void junky_t(const int &foo,const int &bar);

class demo {
public:;
    const junky_t *junk;
};

そして、これが私がコンパイルしようとすると何が起こるかです:

$clang -DHAVE_CONFIG_H  -g -g -O3 -Wall -MD -Wpointer-arith -Wshadow -Wwrite-strings -Wcast-align -Wredundant-decls -Wdisabled-optimization -Wfloat-equal -Wmultichar -Wmissing-noreturn -Woverloaded-virtual -Wsign-promo -funit-at-a-time -Weffc++  -D_FORTIFY_SOURCE=2  -MT demo.o -MD -MP -c -o demo.o demo.cpp

demo.cpp:5:5: warning: qualifier on function type 'junky_t' (aka 'void (const int &, const int &)') has unspecified behavior
    const junky_t *junk;
    ^~~~~~~~~~~~~
1 warning generated.

つまり、クラスdemoには、多数のconst参照を受け取るシグニチャを持つ関数への関数ポインタがあります。constクラス内のは、変更されdemoないようにする必要があります。junkただし、関数自体が考慮される可能性があるため、明らかにあいまいですが、そうconstではありません。これをgccまたはでコンパイルするのに問題はありませんが、Macではllvmコンパイルできません。clang私は何をすべきか?

4

1 に答える 1

3

これは不特定の動作ではありません。clangの警告は間違っています。あなたのコードは合法的なC++です。標準(C ++ 11)は、関数型の上にあるcv修飾子は無視されると述べています。

したがって、関数型の上にconst修飾子を置くことは意味がありません。ポインタをconstにしたい場合は、次のように記述します。

junky_t * const junk;

それ以外の場合は、

junky_t * junk;

于 2012-11-22T15:15:59.363 に答える