小编Aka*_*ksh的帖子

是否有合理使用函数返回匿名结构?

这是一个使用函数的(人工)示例,该函数返回一个匿名结构并执行"有用"的东西:

#include <iostream>

template<typename T>
T* func(T* t, float a, float b) {
    if(!t) {
        t = new T;
        t->a = a;
        t->b = b;
    } else {
        t->a += a;
        t->b += b;
    }
    return t;
}

struct {
    float a, b;
}* foo(float a, float b) {
    if(a==0) return 0;
    return func(foo(a-1,b), a, b);
}

int main() {
    std::cout << foo(5,6)->a << std::endl;
    std::cout << foo(5,6)->b << std::endl;

    void* v = (void*)(foo(5,6));
    //[1] delete f now because I …
Run Code Online (Sandbox Code Playgroud)

c++ templates memory-leaks anonymous-types

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

将匿名临时函数对象传递给模板化构造函数的问题

我试图附加一个函数对象来被破坏一个模板化的类.但是,我似乎无法将函数对象作为临时对象传递.我得到的警告是(如果评论该行xi.data = 5;):

    warning C4930: 'X<T> xi2(writer (__cdecl *)(void))': 
    prototyped function not called (was a variable definition intended?)
            with
            [
                T=int
            ]
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用构造的对象,我得到一个编译错误说:

error C2228: left of '.data' must have class/struct/union
Run Code Online (Sandbox Code Playgroud)

我为冗长的代码道歉,但我认为所有组件都需要可见才能评估情况.

template<typename T>
struct Base
{
    virtual void run( T& ){}
    virtual ~Base(){}
};

template<typename T, typename D>
struct Derived : public Base<T>
{
    virtual void run( T& t )
    {
        D d;
        d(t);
    }
};

template<typename T>
struct X
{
    template<typename R>
    X(const R& r)
    { …
Run Code Online (Sandbox Code Playgroud)

c++ templates anonymous functor

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

C ++ lambda按值捕获而无需提前声明变量

查看页面上的示例:

https://en.cppreference.com/w/cpp/algorithm/generate

它使用lambda:

std::generate(v.begin(), v.end(), [n = 0] () mutable { return n++; });
Run Code Online (Sandbox Code Playgroud)

该变量n未在lambda之前的任何地方声明。

在MSVC 14和GCC 9.1中尝试了此代码段后,它确实可以在两者上正常工作。

尝试在以下位置找到对此行为的引用:

https://en.cppreference.com/w/cpp/language/lambda

但找不到可以在lambda的捕获区域中声明新变量的地方。

这是预期的行为吗?有什么限制?

c++ c++11

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