可能重复:
未定义的行为和序列点
我不确定这是否是一个gcc bug,所以我会问:
unsigned int n = 0;
std::cout << n++ << n << ++n;
Run Code Online (Sandbox Code Playgroud)
gcc给出了非常奇怪的结果:AFAICT是不可能的"122".因为<<是左关联的,它应该是相同的:
operator<<(operator<<(operator<<(std::cout, n++), n), ++n)
Run Code Online (Sandbox Code Playgroud)
并且因为在评估参数之前和之后存在一个序列点,所以n在两个序列点之间永远不会被修改两次(甚至访问) - 因此它不应该是未定义的行为,只是未指定的评估顺序.
所以AFAICT的有效结果将是:111 012 002 101
没有别的
通常在模板中你想知道整个类型,但在我的情况下我需要知道更多,并希望"分解"类型.举个例子:
template <typename Collection<typename T> >
T get_front(Collection const& c)
{
return c.front();
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?注意:我需要它来自动推断类型,而不是传递类似的东西<std::vector<int>, int>
在C++中,您可以创建一个"函数类型",例如:
void main() {
int a();
}
Run Code Online (Sandbox Code Playgroud)
并且a具有"int()"类型,但是可以使用它吗?我甚至无法传递'a'作为模板参数(但我可以将"int()"作为一个传递)