小编aaa*_*x88的帖子

有没有办法选择两个生命周期中较小的一个?

我的意思是:

fn minimum<'a, 'b>(x: &'a mut i32, y: &'b mut i32) -> &'min(a, b) mut i32 {
    (x < y) ? x : y
}
Run Code Online (Sandbox Code Playgroud)

我们不知道在生命周期中将选择哪个引用,但编译器知道两个引用在哪个范围内仍然有效,并且可以安全地使用返回的引用.

可以提及的解决方法:

fn minimum<'a, 'b> where 'b: 'a (x: &'a i32, y: 'b i32) -> &'a i32 {
    (x < y) ? x : y
}
Run Code Online (Sandbox Code Playgroud)

实际上并不是解决方案,因为在调用函数时我们必须处理两种情况:when 'a: 'b'b: 'a

lifetime rust

12
推荐指数
1
解决办法
93
查看次数

可以`if constexpr`用于声明具有不同类型和init-expr的变量

例如:

void foo()
{
    if constexpr (...)
        int x = 5;
    else
        double x = 10.0;
    bar(x); // calls different overloads of bar with different values
}
Run Code Online (Sandbox Code Playgroud)

这是D lang的常见情况,但我没有找到有关C++ 17的信息.

当然,可以使用类似的东西

std::conditional<..., int, double>::type x;
Run Code Online (Sandbox Code Playgroud)

但仅限于基本情况.即使是不同的初始化者(如上所述)也会产生很大的问题.

c++ metaprogramming c++17 if-constexpr

8
推荐指数
1
解决办法
853
查看次数

使用依赖嵌套参数类型传递模板模板参数时出错

为什么这种结构不起作用?

Visual Studio显示错误C3201:类模板"AA"的模板参数列表与模板参数"C"的模板参数列表不匹配.但似乎<int, char, bool>在两种情况下都是如此.

template<int I, char C, bool B>
struct AA
{
    static const int  i = I;
    static const char c = C;
    static const bool b = B;
};

template<typename... T>
struct outer
{
    template <template<T... > typename C>
    struct inner
    {
        template<T... X>
        using type = C<X...>;
    };
};

static_assert(outer<int, char, bool>::inner<AA>::type<5, 'a', true>::i == 5, "???");
Run Code Online (Sandbox Code Playgroud)

ADDED:此外,编译器无法推断出专业化类型

template<class T, template<T> class C, T X>
struct A<C<X>> { ... };
Run Code Online (Sandbox Code Playgroud)

这些技巧是否被标准禁止或只是编译器限制?

c++ templates template-templates variadic-templates

6
推荐指数
1
解决办法
145
查看次数

const 右值引用是否允许对编译器进行额外优化?

constC++中函数参数的修饰符表示该函数不能改变参数值,但不保证在函数执行过程中不能被其他人改变。因此,编译器无法根据数据不变性进行任何优化。

据我了解,右值引用意味着给定的对象是临时的,因此其他人都无法访问其 data。在这种情况下,编译器可以进行积极的优化吗?

它将允许通过某种方式获得更快的代码

template<class T>
class Immutable 
{ 
private: 
    const T val; 
public: 
    operator const T && () { return std::move(val); } 
};
Run Code Online (Sandbox Code Playgroud)

(只是示例代码),或者const&&当我们确定它们在函数调用期间无法更改时传递值。是否有可能,或者有一些未提及的问题?

c++ optimization constants compiler-optimization rvalue-reference

0
推荐指数
1
解决办法
402
查看次数