小编use*_*445的帖子

意外的评估顺序(编译器错误?)

可能重复:
未定义的行为和序列点

我不确定这是否是一个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

没有别的

c++ compiler-construction gcc operator-precedence

5
推荐指数
2
解决办法
1480
查看次数

如何"模式匹配"模板?

通常在模板中你想知道整个类型,但在我的情况下我需要知道更多,并希望"分解"类型.举个例子:

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++ templates

5
推荐指数
1
解决办法
2864
查看次数

你怎么用"功能类型"?

在C++中,您可以创建一个"函数类型",例如:

void main() {
 int a();
}
Run Code Online (Sandbox Code Playgroud)

并且a具有"int()"类型,但是可以使用它吗?我甚至无法传递'a'作为模板参数(但我可以将"int()"作为一个传递)

c++

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