相关疑难解决方法(0)

C++中编译器和评估的参数顺序

好吧,我知道标准规定C++实现可以选择评估函数的哪个顺序参数,但是在实际影响程序的情况下是否有任何实现"利用"它的实现?

经典示例:

int i = 0;
foo(i++, i++);
Run Code Online (Sandbox Code Playgroud)

注意:我不是在找人告诉我评估的顺序不能依赖,我很清楚这一点.我只对任何编译器是否真的按照从左到右的顺序进行评估感兴趣,因为我的猜测是,如果他们做了很多写得不好的代码就会破坏(这是正确的,但他们仍然可能会抱怨).

c++ operator-precedence

59
推荐指数
4
解决办法
2万
查看次数

如何正确使用带有可变参数模板的引用

我有类似下面的代码:

   template<typename T1, typename T2, typename T3, typename T4>
   void inc(T1& t1, T2& t2, T3& t3, T4& t4) { ++t1; ++t2; ++t3; ++t4; }

   template<typename T1, typename T2, typename T3>
   void inc(T1& t1, T2& t2, T3& t3) { ++t1; ++t2; ++t3; }

   template<typename T1, typename T2>
   void inc(T1& t1, T2& t2) { ++t1; ++t2; }

   template<typename T1>
   void inc(T1& t1) { ++t1; }
Run Code Online (Sandbox Code Playgroud)

我想使用即将推出的标准中提出的可变参数模板重新实现它.然而,到目前为止我在网上看到的所有例子似乎都是类似于printf的例子,这里的区别似乎是引用的使用.我想出了以下内容:

inline void inc() { }

template<typename T>
inline void inc(T&& t) { ++t; }

template<typename T,typename …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic c++11

13
推荐指数
1
解决办法
2862
查看次数

在可变扩展中的排序

对于这个非变量的例子:

int     Func1();
double  Func2();
void    MyFunc( int, double );

int  main()
{
    MyFunc( Func1(), Func2() );
    //...
}
Run Code Online (Sandbox Code Playgroud)

它没有规定是否Func1()还是Func2()先计算,只是两者都必须做之前MyFunc()被调用.

这个测序如何与可变参数的扩展一起工作?

template < typename Func, typename ...Args >
void  MyFunc2( Func &&f, Args&& ...a )
{
    int  b[] = { f( std::forward<Args>(a) )... };
    //...
}
Run Code Online (Sandbox Code Playgroud)

假设这f是一个在第一次调用后改变其状态的函数对象.是否会f为每个段调用a?换句话说,将fa列表中的第一个项目,然后第二个项目,第三个项目等上调用,而不是随机跳过扩展列表?我们曾经在每个项目之间调用序列点吗?

c++ variadic-functions sequence-points variadic-templates c++11

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

为什么编译器不能通过逗号运算符扩展可变参数模板的参数?

我知道我们不能使用可变扩展,就好像它是一个逗号运算符链.在那个问题中,样本是这样的:

template<typename... Args>
inline void increment_all(Args&... args) 
{
    ++args...; 
}
Run Code Online (Sandbox Code Playgroud)

首先增加或扩展可能是不明确的,所以括号不会受到伤害:

template<typename... Args>
inline void increment_all(Args&... args)
{
    (++args)...; 
}
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

template<typename... Args>
void cout_all(Args&&... args)
{
    (std::cout << std::forward<Args>(args))...; 
}
Run Code Online (Sandbox Code Playgroud)

我知道我们可以使用一些递归技巧来获得我们想要的东西,比如这样.我不知道为什么标准没有描述这种行为?我的意思是,背后的原因是什么?

c++ comma variadic-templates c++11

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