我正在使用C++ 11项目clang++-3.4,并决定编译使用g++-4.8.2,以防产生的错误有任何差异.事实证明,g ++拒绝了一些clang ++接受的代码.我已将问题减少到下面给出的MWE.
enum { a };
template <class T>
struct foo
{
static constexpr auto value = a;
};
int main()
{
static constexpr auto r = foo<int>::value;
}
Run Code Online (Sandbox Code Playgroud)
foo.cpp:5:23:错误:'
const<anonymous enum> foo<int>::value',使用匿名类型声明,但是使用但从未定义[-fpermissive]Run Code Online (Sandbox Code Playgroud)static const auto value = A;
我想帮助回答以下两个问题:
哪个编译器在解释标准时是正确的?我假设一个编译器正确接受或拒绝代码,另一个是错误的.
我该如何解决这个问题?我无法命名匿名枚举,因为它来自第三方库(在我的情况下,枚举是Eigen::RowMajor和Eigen::ColMajor).
我遇到了以下情况:
struct Foo
{
static constexpr char s[] = "Hello world";
};
const char Foo::s[];
Run Code Online (Sandbox Code Playgroud)
这段代码片段与Clang 3.7编译(带-std=c++11和-std=c++14),但GCC(4.8,6.0,相同的语言设置)给出了我预期的错误:
GCC 4.8:
in.cpp:6:19: error: redeclaration ‘Foo::s’ differs in ‘constexpr’
const char Foo::s[];
^
in.cpp:3:27: error: from previous declaration ‘Foo::s’
static constexpr char s[] = "Hello world";
^
in.cpp:6:19: error: declaration of ‘constexpr const char Foo::s [12]’ outside of class is not definition [-fpermissive]
const char Foo::s[];
Run Code Online (Sandbox Code Playgroud)
GCC 6.0:
‘constexpr’ needed for in-class initialization of static data member ‘const char …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
#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() …Run Code Online (Sandbox Code Playgroud)