这是一个使用函数的(人工)示例,该函数返回一个匿名结构并执行"有用"的东西:
#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) 我试图附加一个函数对象来被破坏一个模板化的类.但是,我似乎无法将函数对象作为临时对象传递.我得到的警告是(如果评论该行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) 查看页面上的示例:
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的捕获区域中声明新变量的地方。
这是预期的行为吗?有什么限制?