【发布时间】:2017-05-20 08:14:19
【问题描述】:
我有近乎以下的结构来检测类型是否可以按值传递:
template <class T>
struct should_be_passed_by_value {
static constexpr bool value =
std::is_scalar<T>::value ||
std::is_array<T>::value ||
std::is_reference<T>::value ||
(sizeof(T) <= sizeof(void*));
};
问题是:当我为类 C 函数指针或 std::function 实例化它时,编译器会说:
invalid application of 'sizeof' to a function type
(当然)。
如何修改它以使value 包含false?
【问题讨论】:
-
您使用的是哪个编译器?你能举一个产生错误信息的例子吗?我尝试了 'should_be_passed_by_value
::value' 并使用 Visual Studio 2015 和 gcc 4.9 成功编译。 -
@FrançoisAndrieux 试试
void foo() {}然后should_be_passed_by_value<decltype(foo)>::value; -
@OP 你能显示产生错误的调用代码吗?
-
你确定它不适用于 std::function 吗??它当然应该!也许您应该提供一个最小的、完整的示例,更多地说明您是如何做到这一点的。
-
@AndyG,我猜作者真的想将大小与 ptr 大小进行比较,而不是检查它是否为 void* ?
标签: c++ templates c++14 function-pointers