compile-time相关内容
我试图在编译时验证给定的lambda是否接受某种类型(在我的示例代码中为Double)。只要lambda的签名明确指定了类型,它就可以工作。但是,只要我在签名中使用带有AUTO的泛型lambda,在计算Requires语句时就会出现编译错误。 以下代码片段说明了该问题(also on compiler explorer) #include #include
..
考虑以下代码: #include #include template inline constexpr const void *foo = &typeid(T); int main() { constexpr bool a = std::less{}(foo, foo
..
为了区分编译器已知值,从而能够在编译时检测错误,使用‘constexpr’参数会很有用。示例: int do_something(constexpr int x) { static_assert(x > 0, "x must be > 0"); return x + 5; } int do_something(int x) { if(x > 0) { cout
..
我想编写一个对字符串容器进行操作的函数模板,例如 std::vector. 我想用相同的模板函数同时支持 CString 和 std::wstring. 问题是 CString 和 wstring 有不同的接口,例如要获取 CString 的“长度",您调用 GetLength() 方法,而不是 wstring 你调用 size() 或 length(). 如果我们在 C++ 中
..
为什么 Ada 编译器允许范围违规通过?它确实给出了警告,但是如果它在任何情况下都是错误的,为什么它让它通过呢?是否存在一种实用的行为? 最重要的是:为什么类型声明是运行时实体?我的意思是代码示例的第 3 行是我希望提前评估的内容.我认为只有第 5 行会“使它"成为可执行文件.为什么不?那东西有用吗?我是否在这里遗漏或误解了某些内容? 与 Ada.Text_IO;程序问题是子类型测试是自然
..
什么是编译时多态性,为什么它只适用于函数? 解决方案 回到过去,“编译时多态性"意味着函数重载.它仅适用于函数,因为它们都是你可以重载的. 在当前的 C++ 中,模板改变了这一点.Neil Butterworth 已经举了一个例子.另一个使用模板专业化.例如: #include #include 模板结构我的模板{富;my_template()
..
在 C 中,const 限定符使对象只读,但不是常量表达式.例如,不可能使用 const int 变量来对数组进行标注: const int n = 10;int arr [n];/* 编译时错误 */ 这是什么技术原因?编译器在编译时不可能知道对象实际上有一个常量值吗? 我不认为我的问题是 Can a const 变量用于在 C 中声明数组的大小?因为我不是在问这是否可能(在我的问题中
..
我正在尝试在 Rust 中实例化一个数组.这是我可以在运行时执行此操作的一种方法: 让 mut t = [0_u32;65];对于我在 0..t.len() {t[i] = ((i as f64).sin().abs() * 2.0_f64.powf(32.0)).floor() as u32;} 但是,由于我永远不会更改这个数组的值,而且我会经常使用这些值,所以我认为这可能是一个很好的机会来
..
我们使用 Hudson 来构建我们的项目,并且 Hudson 可以方便地定义环境变量,例如“%BUILD_NUMBER%"编译时间. 我想在代码中使用该变量,这样我们就可以在运行时记录下构建的内容.但是我不能做 System.Environment.GetEnvironmentVariable 因为那是访问运行时环境,我想要的是这样的: #define BUILD_NUM = %BUILD
..
我了解运行时和编译时之间的区别以及如何区分两者,但我只是认为没有必要区分编译时和运行时依赖项. 让我感到窒息的是:程序如何不依赖在运行时依赖于它在编译期间依赖的东西?如果我的 Java 应用程序使用 log4j,那么它需要 log4j.jar 文件才能编译(我的代码与 log4j 内部的成员方法集成和调用成员方法)以及运行时(我的代码完全无法控制 log4j 中的代码发生后会发生什么.jar
..
我想在编译时使用类型的名称.例如,假设我写了: constexpr size_t my_strlen(const char* s){常量字符* cp = s;while(*cp != '\0') { cp++;};返回cp-s;} 现在我想要: template constexpr auto type_name_length = my_strlen(typeid(T).name()); 但
..
我经历了这个文章.我理解解释的规则,但我想知道在定义常量多维数组并使用给定类型的已知值直接初始化它时究竟是什么阻止了编译器接受以下语法: const int multi_arr1[][] = {{1,2,3}, {1,2,3}};//为什么不?const int multi_arr2[][3] = {{1,2,3}, {1,2,3}};//行错误:将“multi_arr1"声明为多维数组必须有边
..
我目前正在学习 Haskell,但有一件事让我感到困惑: 当我构建一个复杂的表达式(其计算需要一些时间)并且该表达式是常量(意味着它仅由已知的硬编码值构建)时,该表达式不会在编译时计算. 来自 C/C++ 背景的我已经习惯了这种优化. 在 Haskell/GHC 中不执行此类优化(默认情况下)的原因是什么?如果有的话,有什么优势? 数据树 a =空树|节点a(树a)(树a)推导
..
template结构因子{enum { value = n * Factorial::value};};模板结构因子{枚举{值= 1};};int main() {std::cout
..
我正在编写一些模板类来解析一些文本数据文件,因此很可能绝大多数解析错误都是由于数据文件中的错误引起的,而这些错误大部分不是由程序员编写的,所以需要一个关于为什么应用程序加载失败的好消息,例如类似: 解析 example.txt 时出错.[MySectiom]Key 的值 ("notaninteger") 不是有效整数 我可以从传递给模板函数的参数和类中的成员变量中计算出文件、部分和键的
..
既然可以在运行时调用声明为 constexpr 的函数,那么编译器根据什么标准决定是在编译时还是在运行时计算它? templateconstexpr base_t POW(base_t base, expo_t expo){返回(世博会!= 0)?base * POW(base, expo -1) : 1;}int main(int argc, char** argv){int i = 0;st
..
我有一个作为 std::map 实现的符号表.对于值,无法通过默认构造函数合法地构造值类型的实例.但是,如果我不提供默认构造函数,则会出现编译器错误,如果我使构造函数断言,我的程序可以正常编译但在 map::operator [] 如果我尝试使用它来添加新成员. 有没有办法让 C++ 在编译时禁止 map[k] 作为左值(同时允许它作为 r 值)? 顺便说一句:我知道我可以使
..
在 C(不是 C++)中实现编译时静态断言的最佳方法是什么,特别强调 GCC? 解决方案 C11 标准添加了 _Static_assert 关键字. 这是自 gcc-4.6 开始实施: _Static_assert (0, "assert1");/* { dg-error "静态断言失败:\"assert1\"" } */ 第一个槽需要是一个整数常量表达式.第二个槽是一个可以很长
..
我正在尝试在 Rust 中实例化一个数组.这是我可以在运行时执行的一种方法: let mut t = [0_u32;65];对于我在 0..t.len() {t[i] = ((i as f64).sin().abs() * 2.0_f64.powf(32.0)).floor() as u32;} 然而,因为我永远不会改变这个数组的值,而且我会经常使用这些值,所以我认为这可能是一个很好的机会来探
..
我们可以将数组的引用传递给函数,例如: void f(int (&a)[5]);int x[5];f(x);//好的int y[6];f(y);//错误 - y 的类型不是 `int (&)[5]`. 或者更好的是,我们可以写一个函数模板: templatevoid f(int (&a)[N]);//N是数组的大小!int x[5];f(x);//好的 - N 变成 5int y[6];f(
..