标签: constexpr

使用int作为模板参数,直到运行时才知道

我试图使用整数作为类的模板参数.以下是代码示例:

template< int array_qty > 
class sample_class {

    public:
        std::array< std::string, array_qty > sample_array;

}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,它的工作原理:

sample_class< 10 > sample_class_instance;
Run Code Online (Sandbox Code Playgroud)

但是,假设我在编译时不知道array_qty(模板参数)的值,并且只会在运行时知道它.在这种情况下,我基本上将传递一个int变量作为模板参数.为了演示,以下代码不起作用:

int test_var = 2;
int another_test_var = 5;
int test_array_qty = test_var * another_test_var;

sample_class< test_array_qty > sample_class_instance;
Run Code Online (Sandbox Code Playgroud)

在尝试上述过程中,在编译期间出现以下错误:

the value of ‘test_array_qty’ is not usable in a constant expression
Run Code Online (Sandbox Code Playgroud)

我已经尝试将test_array_qty转换为const,同时将其作为模板参数传递,但这似乎也没有.有没有办法做到这一点,还是我滥用模板参数?也许他们需要在编译时知道?

目标不是解决这个特定的方法,而是找到一种方法将数组的长度设置为一个int变量,可以在实例化类时声明.如果有办法通过模板参数执行此操作,那将是理想的.

请注意,我必须使用一个数组,而不是我最终可能作为建议的向量.此外,array_qty将始终是0到50之间的值 - 如果有所不同.

c++ templates constexpr

7
推荐指数
2
解决办法
7294
查看次数

decltype(constexpr变量)

为什么constexpr变量的decltype失败?

#include <cstdint>
#include <type_traits>

constexpr uint16_t foo(){ return 0;}

constexpr auto cv = foo();
          auto v  = foo();

static_assert( std::is_same< uint16_t, decltype(cv)>::value, "!"); // failed

static_assert( std::is_same< uint16_t, decltype(v) >::value, "!"); // success
Run Code Online (Sandbox Code Playgroud)

c++ static-assert decltype constexpr c++11

7
推荐指数
1
解决办法
1408
查看次数

使用MSVC 2013初始化`static constexpr double`

标题说明了所有这两种常用方法都不起作用.我错过了什么?

1.

class Cl {
    static constexpr double PI;
};
constexpr double Cl::PI = 3.14;
Run Code Online (Sandbox Code Playgroud)

(26):错误C2737:'private:static double const Cl :: PI':'constexpr'对象必须初始化

2.

class Cl {
    static constexpr double PI = 3.14;
};
Run Code Online (Sandbox Code Playgroud)

(26):错误C2864:'Cl :: PI':具有类内初始化程序的静态数据成员必须具有非易失性const整数类型
类型为'const double'

在两次尝试中,错误都在类中的同一行.我正在使用VisualStudio/MSVC 2013年11月CTP编译器.

请注意,使变量const不是解决方案,因为我想在constexpr函数和普通函数中使用此常量.

c++ visual-c++ constexpr c++11 visual-studio-2013

7
推荐指数
1
解决办法
3988
查看次数

为什么通过const引用传递constexpr对象有效,但是按值不能编译

我有下面的代码,它基本上映射std::integer_sequence<>std::array<>编译时:

#include <iostream>
#include <utility>
#include <array>

template<int...Is>
constexpr auto make_array(const std::integer_sequence<int, Is...>& param) // this works */
// constexpr auto make_array(std::integer_sequence<int, Is...> param) // doesn't compile
{
    return std::array<int, sizeof...(Is)> {Is...};
}

int main()
{
    constexpr std::integer_sequence<int, 1,2,3,4> iseq;

    // If I pass by value, error: the value of 'iseq' is not usable in a constant expression
    constexpr auto arr = make_array(iseq);  

    for(auto elem: arr)
        std::cout << elem << " ";
}
Run Code Online (Sandbox Code Playgroud)

只要make_array通过 …

c++ constexpr c++11 c++14

7
推荐指数
2
解决办法
703
查看次数

Constexpr编译错误使用std :: acos和clang ++而不是g ++

我想尝试将项目从gcc迁移到clang ++.我承认我的无知,我不知道为什么以下的代码

template <typename T>
constexpr T pi{std::acos(T(-1.0))};
Run Code Online (Sandbox Code Playgroud)

使用g ++静默编译但clang ++产生错误

trig.hpp:3:13: error: constexpr variable 'pi<float>' must be initialized by a constant expression
constexpr T pi{std::acos(T(-1.0))};
Run Code Online (Sandbox Code Playgroud)

而且我希望有人比我更了解它,可以启发我.

注意:尝试使用-std = C++ 14和C++ 1y.在clang版本3.6.2(标签/ RELEASE_362/final)下失败.适用于g ++(GCC)5.2.0.

c++ compiler-errors constexpr clang++ c++14

7
推荐指数
1
解决办法
1061
查看次数

GCC是否正确要求constexpr说明符用于此参考声明?

下面的代码不能在GCC 5.3.0下编译,因为声明r缺少一个constexpr说明符.

const int i = 1;
const int& r = i;
constexpr int j = r;
Run Code Online (Sandbox Code Playgroud)

我相信拒绝是正确的.如何使用N4527工作草案证明这一点?

c++ gcc language-lawyer constexpr c++14

7
推荐指数
1
解决办法
250
查看次数

Constexpr强制转换为const char []

它发生在很多人身上,它发生在我身上.我在C++中使用编译时间字符串时遇到困难.

我决定采取看似无法使用的方法:使用template <char...>类.

这就是我提出的,它是非常常见的,没什么特别的,它也不起作用.

template <char... chars> class string
{
public:

    static constexpr const char value[] = {chars...};

    constexpr string()
    {
    }

    constexpr operator decltype(value) & () const
    {
        return value;
    }
};

template <char... chars> constexpr const char string <chars...> :: value[];
Run Code Online (Sandbox Code Playgroud)

我的想法是使一个string实例可constexpr构造并暴露某种constexpr转换,以便它提供其内容.

现在,如果我这样做

static constexpr const char x[] = "ciao";

template <const char * str> void print()
{
    std :: cout << str << std :: endl;
}

print <x> ();
Run Code Online (Sandbox Code Playgroud)

这有效并且说 …

c++ templates char constexpr

7
推荐指数
1
解决办法
799
查看次数

"constexpr if"是否被认为是SFINAE?

如何constexpr如果SFINAE有关?
在评估"constexpr if"表达式时,编译器是否使用SFINAE?

我认为"constexpr if" 正在使用SFINAE.
它在条件块中替换,但在不能的情况下不会出错.

另一方面,SFINAE被定义为函数模板的重载解析规则,并且我认为在评估"constexpr if"时您已经处于函数中.

如果取决于函数的调用方式,编译器必须为constexpr的不同路径生成多个函数.所以也许它正在使用重载解析.

被接受的提案没有提到"SFINAE"或"重载决议".
所以我很好奇这两个概念是否适用于"constexpr if".

templates sfinae overload-resolution constexpr c++17

7
推荐指数
1
解决办法
1147
查看次数

在参考定义中使用constexpr和const

我已经看到在Quora上将参考变量声明为C++中的常量.

static constexpr const int& r = 3;
Run Code Online (Sandbox Code Playgroud)

那么,为什么都constexprconst在单个语句中使用?

这种陈述的目的是什么?

c++ const reference constexpr c++14

7
推荐指数
1
解决办法
525
查看次数

"if constexpr"在模板之外有用吗?

我想if constexpr完全理解.

我理解,如果if constexpr(expr)在模板中使用,并且expr依赖于模板参数,那么在实例化期间,只有一个then/ else分支将被实例化,另一个将被丢弃.

我有两个问题:

  • 是真的,如果expr不依赖于模板参数,那么if constexpr(expr)将不会丢弃任何分支?如果是,标准在哪里这样说?我没有看到标准有什么例外,丢弃只在expr依赖时发生.
  • if constexpr模板以外有用吗?如果是,这有什么用例?你能举出一些例子来了解它的用处吗?

c++ constexpr c++17 if-constexpr template-instantiation

7
推荐指数
1
解决办法
255
查看次数