函数类型的限定符..具有未指定的行为

时间:2013-03-28 17:05:31

标签: c++ factory

#ifndef SHAPEFACTORY_H_
#define SHAPEFACTORY_H_

#include <istream>
#include <map>
#include <string>

#include "shape.h"

typedef Shape *(createShapeFunction)(void);
/* thrown when a shape cannot be read from a stream */
class WrongFormatException { };

class ShapeFactory {

public:

    static void registerFunction(const std::string &string, const createShapeFunction *shapeFunction);
    static Shape *createShape(const std::string &string);
    static Shape *createShape(std::istream &ins);

private:

    std::map<std::string, createShapeFunction *> creationFunctions;
    ShapeFactory();
    static ShapeFactory *getShapeFactory();
};

#endif

这是标题,我还没有实现任何方法,但我收到以下警告:

Qualifier on function type 'createShapeFunction' (aka 'Shape *()') has unspecified behavior

ps:这个标题是我的老师给出的,作为一个家庭作业,我必须实现方法

2 个答案:

答案 0 :(得分:3)

这是一个愚蠢的警告信息。它没有被指定,但是你对const的第二个参数的registerFunction限定将被忽略。

让我们看看typedef的{​​{1}}:

createShapeFunction

您可以将此类型读作“不带参数并返回typedef Shape *(createShapeFunction)(void); ”的函数。那么你有一个这种类型的论点:

Shape*

这是指向const createShapeFunction* 函数类型的指针。没有const函数类型,因此const被忽略,参数类型等同于const。也就是说,指向上面定义的函数类型的指针。

你可能意味着createShapeFunction*本身就是一个函数指针类型:

createShapeFunction

现在您可以将此类型读作“指向不带参数的函数并返回typedef Shape *(*createShapeFunction)(void); ”的指针。然后,这将使参数Shape*成为指向const createShapeFunction*函数指针的指针。

答案 1 :(得分:0)

正在发出警告,因为类型const createShapeFunction*尝试创建const限定的函数类型(因为createShapeFunction被定义为返回{{1}的函数的类型并且不接受任何参数)。这就是C ++ 11标准所说的(第8.5.3 / 6段):

  

cv-qualifier-seq在函数声明符中的作用与在顶部添加cv-qualification不同   功能类型。在后一种情况下,忽略cv限定符。 [注意:有一个函数类型   cv-qualifier-seq不是cv限定类型;没有cv限定的函数类型。 - 尾注] [例子:

Shape*
     

-end example]

因此,编译器警告您,您可能意味着其他内容而不是您实际编写的内容,因为函数类型的typedef void F(); struct S { const F f; // OK: equivalent to: void f(); }; 资格只会被忽略。