【发布时间】:2015-08-30 03:13:00
【问题描述】:
我有以下代码:
#include<chrono>
#include<iostream>
using namespace std::chrono_literals;
#define MSG "hello"
#define DUR 1000ms
class mwe{
public:
static constexpr auto msg = MSG;
static constexpr auto dur_1 = DUR;
static constexpr std::chrono::milliseconds dur_2 = DUR;
static const std::chrono::milliseconds dur_3;
static constexpr decltype(DUR) dur_4 = DUR;
};
constexpr std::chrono::milliseconds mwe::dur_2;
const std::chrono::milliseconds mwe::dur_3 = DUR;
constexpr decltype(DUR) mwe::dur_4;
int main(void) {
std::cout << "str: " << mwe::msg << std::endl;
std::cout << "dur_1: " << mwe::dur_1.count() << std::endl;
std::cout << "dur_2: " << mwe::dur_2.count() << std::endl;
std::cout << "dur_3: " << mwe::dur_3.count() << std::endl;
std::cout << "dur_4: " << mwe::dur_4.count() << std::endl;
}
如果我编译它(g++ 4.9),通过
g++ -std=c++14 -O2 test.cpp
一切都按预期工作,但如果我通过编译它
g++ -std=c++14 -O0 test.cpp
我收到以下错误:
undefined reference to `mwe::dur_1'
我个人喜欢这种方式,dur_1 被定义和声明得最多,但如果没有启用优化,它在我的版本中不适用于 g++。 因为我知道的所有其他方式(dur_2、dur_3、dur_4)都有它们的缺点(值的冗余,没有自动类型扣除,例如,如果我想将 1000ms 更改为 1s。)
您是否知道,如果这是一个 gcc 错误,编译可以在生产模式下工作,但如果没有优化就无法工作?
是否有另一种可能的方法来让这个工作,而不在类之外定义 dur_x 的位置?
【问题讨论】:
-
dur_1没有定义。不确定您的预期。