我在理解std::result_ofC++ 0x中的需求时遇到了一些麻烦.如果我理解正确,result_of则用于获取调用具有某些类型参数的函数对象的结果类型.例如:
template <typename F, typename Arg>
typename std::result_of<F(Arg)>::type
invoke(F f, Arg a)
{
return f(a);
}
Run Code Online (Sandbox Code Playgroud)
我真的没有看到与以下代码的区别:
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(f(a)) //uses the f parameter
{
return f(a);
}
Run Code Online (Sandbox Code Playgroud)
要么
template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(F()(a)); //"constructs" an F
{
return f(a);
}
Run Code Online (Sandbox Code Playgroud)
我能用这两种解决方案看到的唯一问题是我们需要:
难道我就在想,唯一的区别decltype和result_of是而第二个不第一个需要表达?
假设我想定义一个表示向量长度的结构及其值,如下所示:
struct Vector{
double* x;
int n;
};
Run Code Online (Sandbox Code Playgroud)
现在,假设我想定义一个向量y并为其分配内存.
struct Vector *y = (struct Vector*)malloc(sizeof(struct Vector));
Run Code Online (Sandbox Code Playgroud)
我在互联网上的搜索显示我应该分别为x分配内存.
y->x = (double*)malloc(10*sizeof(double));
Run Code Online (Sandbox Code Playgroud)
但是,似乎我为y-> x分配内存两次,一次为y分配内存,另一种为y-> x分配内存,这似乎浪费了内存.如果让我知道编译器真正做了什么以及初始化y和y-> x的正确方法,我们非常感激.
提前致谢.
我遇到了句子,"即使临时对象的创建未被评估",在标准12.2中,我也没有得到他们的意思.
所以我读到了关于表达的内容,但我仍然没有得到他们所说的意思.我想,原因是我很难尝试对未评估的表达式进行定义,并将其应用于上述报价.
那么任何人都可以告诉我他们的意思是"即使临时对象的创建没有得到评估"?
上下文:
类型的临时数在各种上下文中创建:绑定对prvalue的引用(8.5.3),返回prvalue(6.6.3),创建prvalue的转换(4.1,5.2.9,5.2.11,5.4) ,抛出异常(15.1),进入处理程序(15.3),以及一些初始化(8.5).[注意:异常对象的生命周期在15.1中描述. - 结束注释]即使临时对象的创建未被评估(第5条)或以其他方式避免(12.8),也应尊重所有语义限制,就好像临时对象已被创建并随后被销毁一样.[注意:即使没有调用析构函数或复制/移动构造函数,也应满足所有语义限制,例如可访问性(第11条)以及函数是否被删除(8.4.3).但是,在用作decltype-specifier(5.2.2)的操作数的函数调用的特殊情况下,不引入临时,因此前述内容不适用于任何此类函数调用的prvalue. - 结束说明]
与仅声明 的函数签名的libc++或MSVC-STL不同std::declval,libstdc++定义了 的函数体std::declval,并在static_assert内部使用以确保它必须在未评估的上下文中使用:
template<typename _Tp, typename _Up = _Tp&&>
_Up
__declval(int);
template<typename _Tp>
_Tp
__declval(long);
template<typename _Tp>
auto
declval() noexcept -> decltype(__declval<_Tp>(0));
template<typename _Tp>
struct __declval_protector {
static const bool __stop = false;
};
template<typename _Tp>
auto
declval() noexcept -> decltype(__declval<_Tp>(0)) {
static_assert(__declval_protector<_Tp>::__stop,
"declval() must not be used!");
return __declval<_Tp>(0);
}
Run Code Online (Sandbox Code Playgroud)
当我们尝试评估 的返回值时std::declval,这static_assert将被触发:
auto x = std::declval<int>(); // static assertion failed: declval() must not …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关ODR使用的信息,遇到了以下问题:
除非满足以下两个条件,否则将使用可能评估的表达式ex中的变量x:
什么是可能评估的表达式?
更新:向下滚动页面时,我可能只是找到答案了:
在上面的定义中,潜在赋值表示表达式不是未赋值的操作数(或其子表达式),例如sizeof的操作数,表达式e的一组潜在结果是一组id表达式(可能为空),出现在e中,组合如下:
但是不确定这是否意味着总体+我还是不太了解他们的解释。另外,为什么要说潜在结果而不是仅仅结果?