首页 > 解决方案 > 尝试在枚举值中组合标志

问题描述

试图构造一个简单的枚举来包含一组 ios:: 标志以便于参考、参数传递等。我希望能够进行调用:

resultCode = DoSomething(param, TRUNCATE);

ResultCode DoSomething(int param, FileOperation_t operation) {...}

我已经这样定义了我的枚举:

typedef enum {
    TRUNCATE = std::ios::out | std::ios::trunc,
    APPEND   = std::ios::out | std::ios::app
} FileOperation_t;

编译结果如下:

error: calls to overloaded operators cannot appear in a constant-expression
     TRUNCATE = std::ios::out | std::ios::trunc,
                                          ^

我不明白这个错误是什么意思。我在这里做错了什么,我该如何完成我想做的事情?

gcc (GCC) 4.8.5 20150623 (红帽 4.8.5-28)

标签: c++enums

解决方案


您的编译器似乎-std=c++98默认使用。改用-std=c++11标志,代码将编译。

在 C++98 中,函数调用(包括重载的操作符调用)在编译时常量表达式中是不允许的(因为没有constexpr语义)。


虽然,它不需要根据标准编译,即使有标志:

这个页面std::ios::openmode的是typedef一个实现定义的类型,满足BitmaskType概念。

虽然 BitmaskType 必须有运算符重载&|等等,但不能保证这些运算符是 constexpr,也不能保证类型本身可以转换为整数类型。

为了获得最大的兼容性,请改用普通const变量:

const std::ios::openmode TRUNCATE = std::ios::out | std::ios::trunc;
const std::ios::openmode APPEND   = std::ios::out | std::ios::app;

(如果您不能使用更新的标准,此解决方案也适用于 C++98。)


推荐阅读