我试图使用整数作为类的模板参数.以下是代码示例:
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之间的值 - 如果有所不同.
为什么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) 标题说明了所有这两种常用方法都不起作用.我错过了什么?
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函数和普通函数中使用此常量.
我有下面的代码,它基本上映射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通过 …
我想尝试将项目从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.
下面的代码不能在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++中使用编译时间字符串时遇到困难.
我决定采取看似无法使用的方法:使用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)
这有效并且说 …
如何constexpr如果和SFINAE有关?
在评估"constexpr if"表达式时,编译器是否使用SFINAE?
我认为"constexpr if" 正在使用SFINAE.
它在条件块中替换,但在不能的情况下不会出错.
另一方面,SFINAE被定义为函数模板的重载解析规则,并且我认为在评估"constexpr if"时您已经处于函数中.
如果取决于函数的调用方式,编译器必须为constexpr的不同路径生成多个函数.所以也许它正在使用重载解析.
被接受的提案没有提到"SFINAE"或"重载决议".
所以我很好奇这两个概念是否适用于"constexpr if".
我已经看到在Quora上将参考变量声明为C++中的常量.
static constexpr const int& r = 3;
Run Code Online (Sandbox Code Playgroud)
那么,为什么都constexpr和const在单个语句中使用?
这种陈述的目的是什么?
我想if constexpr完全理解.
我理解,如果if constexpr(expr)在模板中使用,并且expr依赖于模板参数,那么在实例化期间,只有一个then/ else分支将被实例化,另一个将被丢弃.
我有两个问题:
expr不依赖于模板参数,那么if constexpr(expr)将不会丢弃任何分支?如果是,标准在哪里这样说?我没有看到标准有什么例外,丢弃只在expr依赖时发生.if constexpr模板以外有用吗?如果是,这有什么用例?你能举出一些例子来了解它的用处吗?