为什么这个const说明符有未指定的行为?

时间:2012-11-22 14:42:20

标签: c++ clang compiler-warnings unspecified-behavior

我维护了一个开源程序,我的一个用户报告它不会在clang下编译,这是我以前从未使用过的。我得到的错误之一是 *警告:函数类型'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,而事实并非如此。我使用gccllvm编译时没有问题,但在Mac上无法使用clang进行编译。我该怎么办?

1 个答案:

答案 0 :(得分:3)

这不是未指明的行为。铿锵的警告是错误的。你的代码是合法的c ++。标准(C ++ 11)规定,忽略函数类型之上的cv限定符。

因此,将const限定符放在函数类型之上是没有任何意义的。如果你希望你的指针是const,那么写

junky_t * const junk;

否则只写

junky_t * junk;