Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译时初始化一个非常量变量_C++_Constants_Constexpr_C++20_Consteval - Fatal编程技术网

C++ 编译时初始化一个非常量变量

C++ 编译时初始化一个非常量变量,c++,constants,constexpr,c++20,consteval,C++,Constants,Constexpr,C++20,Consteval,问题: 如何在编译时使用函数初始化非常量变量,同时仍启用对该函数的运行时调用 详细信息:我正在使用C++20,我有以下代码: template<typename T> constexpr auto diag(auto&&.. vals) {...} // ... constexpr auto M = diag<double>(1,2,3); 在这里,M不是常数,但它是从一个常数、编译时确定的对角矩阵赋值的。您可以使用中间constepr变量: const

问题: 如何在编译时使用函数初始化非常量变量,同时仍启用对该函数的运行时调用

详细信息:我正在使用C++20,我有以下代码:

template<typename T>
constexpr auto diag(auto&&.. vals) {...}
// ...
constexpr auto M = diag<double>(1,2,3);

在这里,M不是常数,但它是从一个常数、编译时确定的对角矩阵赋值的。

您可以使用中间
constepr
变量:

constexpr auto MInit = diag<double>(1,2,3);
auto M = MInit;
constexpr auto MInit=diag(1,2,3);
自动M=MInit;
您可以用lambda包装它:

auto M = [](){ constexpr auto MInit = diag<double>(1,2,3); return MInit; }();
autom=[](){constexpr auto MInit=diag(1,2,3);返回MInit;}();

M
删除
constepr
时,您是如何确定函数在运行时执行的?这听起来很奇怪,因为分配给的变量不应该影响函数是否可以在编译时进行求值。
constexpr
函数可以同时执行这两项功能,因此它应该是您想要的。由于您使用的是c++20,您是否看到了新的说明符?@super我使用的。是的,我也觉得很奇怪。首先,我认为这取决于我是否有constexpr构造函数,但它似乎没有改变。如果你提供一个能证明这一点的函数,你的问题会更容易回答。@super With constint我得到以下错误(gcc):
constinit'只能应用于具有静态或线程存储持续时间的变量
(我有
constinit auto M=diag(2,3,4);
在Mícode中)。这看起来是个好主意。尽管如此,它会像没有中间变量的代码一样快吗?@adel没有中间变量的代码是什么?@Yakk AdamNevraumont我的意思是:添加中间变量会使代码运行变慢吗?@adel删除中间变量会使初始化在运行时发生,所以没有。如果您想将它与没有中间变量的特定实现进行比较,您必须说明是哪一个。因为证据中没有“完全相同的代码在没有中间变量的情况下表现相同”,我认为这就是你暗示我们应该将其与之比较的地方。@jarod42为此,我可能会制作一个全局constexpr,比如is_same_v。使用现场的清洁剂。
Matrix<double, 3, 3> M = { {1.0,0.0,0.0}, {0.0,2.0,0.0}, {0.0,0.0,3.0}};
constexpr auto MInit = diag<double>(1,2,3);
auto M = MInit;
auto M = [](){ constexpr auto MInit = diag<double>(1,2,3); return MInit; }();