小编joh*_*ohn的帖子

嵌套 lambda 导致编译器耗尽堆

我正在编写一些代码,将 lambda 函数传递给一组递归函数。其中一些 lambda 函数嵌套在其他 lambda 函数内。我认为我正在编写有效的代码,但出现错误fatal error C1060: compiler is out of heap space

这是代码的精简版本

struct Null
{
    template <typename SK>
    static void match(SK sk)
    {
    }
};

template <typename T>
struct Repetition
{
    template <typename SK>
    static void match(SK sk)
    {  // <--------------------------------- error message points to this line
        T::match([]() { match([]() {}); });
    }
};

int main()
{
    using Test = Repetition<Null>;
    Test::match([](){});
}
Run Code Online (Sandbox Code Playgroud)

现在这个最小版本没有多大意义,但它有相同的编译器错误。我已经指出了上面错误的行。

我的问题是,这是编译器错误/限制还是我的代码在某种程度上无效?

编译器是 Visual Studio 2022 编译 C++20。

谢谢

c++ c++11

5
推荐指数
1
解决办法
117
查看次数

使用const double * const作为模板参数-代码日志

我试图了解const double* const用作模板的内幕。我有一些非常基本的计算想要高效执行,但是我不知道c ++编译器是如何工作的(汇编代码是什么)。

这个想法是为一个函数创建一个模板,该函数将3个常量double用作模板参数,并将double用作参数。

constexpr double p1 = 1;
constexpr double p2 = 2;
constexpr double p3 = 3;

template <const double* const a, 
        const double* const b, 
        const double* const c>
inline double func(double value)
{
    constexpr double d = *a - *b;
    constexpr double e = *a - *c;
    constexpr double ratio = d / e;
    constexpr double remain = *c - *a * ratio;

    return value * ratio + remain;
}

double func2(double c) …
Run Code Online (Sandbox Code Playgroud)

c++ double templates precompiled constexpr

4
推荐指数
2
解决办法
72
查看次数

C++不允许您从构造函数中调用私有函数吗?

我有以下程序

#include <iostream>

class Blah {
    private:
        void hello();  
    public:
        Blah();  
};

void Blah::hello() {
    std::cout << "Hello, world" << std::endl;
}

Blah::Blah() {
    hello();
}

int main() {
    Blah a();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它编译得很好,但是当我运行它时,程序不会像我预期的那样在控制台中打印"Hello,world".为什么是这样?

c++

3
推荐指数
1
解决办法
111
查看次数

在C++中,setter和getter以及构造函数之间的区别是什么?

如果我们使用构造函数,我们需要使用setter和getter.我对这些术语完全感到困惑,有人可以详细说明.

c++ oop

2
推荐指数
1
解决办法
99
查看次数

如何编写一个维护本地状态的宏?

这似乎有效,它是一个宏,可以根据扩展的次数扩展到连续的整数.

;; Library (test macro-state)
(library
 (test macro-state)
 (export get-count incr-count)
 (import (rnrs))

 (define *count* 0)
 (define (get-count) *count*)
 (define (incr-count) (set! *count* (+ *count* 1)))

 )

;; Program
(import (rnrs) (for (test macro-state) expand))

(define-syntax m
  (lambda (x)
    (syntax-case x ()
      ((m) (begin (incr-count) (datum->syntax #'m (get-count)))))))

(write (list (m) (m) (m)))
(newline)
;; prints (1 2 3)
Run Code Online (Sandbox Code Playgroud)

但它对我来说很笨拙,因为宏状态*count*和宏m本身在不同的模块中.有没有更好的方法在r6rs中执行此操作,最好是不将两个模块的实现分开?

编辑

我应该说清楚,尽管这个例子只是一个宏,但实际上我正在寻找一种在多个宏需要共享状态时有效的方法.

scheme r6rs

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

using namespace std; 在头文件中

有些人声称这using namespace std;是不好的做法.其他人说这样就好了.但是每个人都同意将它放在头文件中是禁止的.

亲爱的读者,可以从Bjarne Stroustrup自己的网站上解释一下.

http://www.stroustrup.com/Programming/Graphics/std_lib_facilities.h

他甚至没有把它放在你可能注意到它的顶部,它大约有50行.

这里发生了什么?是恶作剧黑客通过在他的网站上放置不良代码来诋毁BS吗?

c++ coding-style

-6
推荐指数
1
解决办法
1439
查看次数

标签 统计

c++ ×5

c++11 ×1

coding-style ×1

constexpr ×1

double ×1

oop ×1

precompiled ×1

r6rs ×1

scheme ×1

templates ×1