请考虑以下代码:
#include <cstdio>
#include <cmath>
const int COUNT = 1000000000;
int main()
{
double sum = 0;
for (int i = 1; i <= COUNT; ++i) {
sum += sqrt(i);
}
printf("%f\n", sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
没有-O2,它在我的计算机上只运行2.9秒,而运行6.4秒-O2.
我的电脑是Fedora 23,带有g ++ 5.3.1.
我在Ubuntu 14.04(使用g ++ 4.8)上尝试了相同的东西,它没有问题(所有6.4s).
我试图编写一个函数来转发可变参数模板函数的参数,类似于std::invoke.这是代码:
#include <functional>
template<class... Args>
void f(Args&&... args) { }
template<template<class...> class F, class... Args>
void invoke(F<Args...> f, Args&&... args) {
f(std::forward<decltype(args)>(args)...);
}
int main() {
invoke(f, 1, 2, 3);
std::invoke(f, 1, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)
但是,我invoke和std::invoke编译都失败了.g ++抱怨它无法推断出模板参数template<class ...> class F.那么是否可以在没有显式模板特化的情况下调用可变参数模板函数?