相关疑难解决方法(0)

`static constexpr auto` data-member用未命名的枚举初始化

我正在使用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]

static const auto value = A;
Run Code Online (Sandbox Code Playgroud)

我想帮助回答以下两个问题:

  • 哪个编译器在解释标准时是正确的?我假设一个编译器正确接受或拒绝代码,另一个是错误的.

  • 我该如何解决这个问题?我无法命名匿名枚举,因为它来自第三方库(在我的情况下,枚举是Eigen::RowMajorEigen::ColMajor).

c++ enums language-lawyer auto c++11

26
推荐指数
3
解决办法
4419
查看次数

混合constexpr声明和const定义

我遇到了以下情况:

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)

c++ static-members c++11

18
推荐指数
1
解决办法
421
查看次数

静态constexpr在g ++ 4.9上的未定义引用,没有优化

我有以下代码:

#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)

c++ gcc c++11 c++14

4
推荐指数
1
解决办法
694
查看次数

标签 统计

c++ ×3

c++11 ×3

auto ×1

c++14 ×1

enums ×1

gcc ×1

language-lawyer ×1

static-members ×1