小编LeD*_*YoM的帖子

有可能知道constexpr什么时候真的是constexpr?

由于constexpr的扩展版本(我想从C++ 14开始),你可以声明constexpr函数,它们可以用作"真正的"constexpr,即代码在编译时执行或者可以表现为内联函数.那么什么时候可以有这个程序:

#include <iostream>

constexpr int foo(const int s) {
  return s + 4;
}

int main()
{
    std::cout << foo(3) << std::endl;
    const int bar = 3;
    std::cout << foo(bar) << std::endl;
    constexpr int a = 3;
    std::cout << foo(a) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,结果是:

7
7
7
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.所以我的问题是:如果函数在编译时或运行时执行,有没有办法(可能是标准的)知道foo(const int s)?

编辑:也可以在运行时知道在编译时是否评估了函数?

c++ constexpr c++14 c++17

21
推荐指数
5
解决办法
2800
查看次数

如何在MISRA C++之后实现CRTP

我的团队正在开发一个嵌入式系统,我们需要遵循MISRA C++.

我们正在重构代码以使用更少的虚方法,因此我们尝试实现CRTP以使用静态多态而不是动态多态.

但是我们遇到静态多态性需要指针转换的问题,因此我们的静态分析检查器会抱怨.

这是界面

template <typename T>
class UpdateMethod
{
protected:
    ~UpdateMethod() {}
 public:
    void operator()() const
    {
        // [MISRA Rule 5-2-7] violation:
        static_cast<const T*>(this)->update();
    }
};
Run Code Online (Sandbox Code Playgroud)

以下是其中一个实现:

class A
    : public UpdateMethod<A>
{
 public:
    void update() const {}
};
Run Code Online (Sandbox Code Playgroud)

在通过MISRA检查程序时,它会抱怨static_cast(从ptr转换为ptr(e926).

所以,我的问题是:有没有什么好的方法来实现CRTP而不必压制MISRA警告,所以以安全的方式?

仅有关于指针转换的相关问题: MISRA C++ 2008规则5-2-7违规:指针类型的对象不应直接或间接转换为无关指针类型 我在CRTP中具有相同的错误.

编辑:正如前面提到的只有C++ 03而没有像boost这样的外部库.

c++ misra crtp static-cast c++03

11
推荐指数
1
解决办法
374
查看次数

是否可以为不应编译的表达式表达static_assert?

我想用以下形式表达一个static_assert:

static_assert(expression should not compile);
Run Code Online (Sandbox Code Playgroud)

让我添加一个完整的示例:

template <bool Big>
struct A{};

template <>
struct A<true>
{
    void a() {}
};

A<false> b;

static_assert(!compile(b.a()));
or
static_assert(!compile(A<false>::a()));
Run Code Online (Sandbox Code Playgroud)

因此,该想法是要确保不会编译表达式(具有有效语法)。

如果可能的话,该解决方案仅使用C ++ 11会更好。

c++ static-assert c++11

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

谁管理副本构造函数在参数中引发的异常?

假设我有这个功能

void foo() noexcept
{
   // Safely noexcept code.
}
Run Code Online (Sandbox Code Playgroud)

然后这个课:

class Bar
{
   Bar(const Bar&) { ... } // Is not noexcept, so might throw
   // Non movable:
   Bar(Bar&&) = delete;
};
Run Code Online (Sandbox Code Playgroud)

现在,我需要修改foo()以通过值接收Bar:

void foo(Bar bar) // noexcept?
{
   // Safely noexcept code
}
Run Code Online (Sandbox Code Playgroud)

我假设Bar的复制是在调用foo之前完成的,因此从理论上讲foo的代码仍然可以是noexcept,但是我不确定在C ++级别上是如何定义的。foo是否需要删除noexcept或在应对Bar时可能抛出的调用方?它取决于调用模式(stdcall,farcall等)还是编译器?更新:在其他问题中,我没有找到任何有关调用约定的引用。那应该改变行为。我吃了

c++ exception pass-by-value copy-constructor noexcept

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