由于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)?
编辑:也可以在运行时知道在编译时是否评估了函数?
我的团队正在开发一个嵌入式系统,我们需要遵循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这样的外部库.
我想用以下形式表达一个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会更好。
假设我有这个功能
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等)还是编译器?更新:在其他问题中,我没有找到任何有关调用约定的引用。那应该改变行为。我吃了