相关疑难解决方法(0)

"static const"vs"#define"vs"enum"

在C中的以下陈述中哪一个更好用?

static const int var = 5;
Run Code Online (Sandbox Code Playgroud)

要么

#define var 5
Run Code Online (Sandbox Code Playgroud)

要么

enum { var = 5 };
Run Code Online (Sandbox Code Playgroud)

c constants

550
推荐指数
12
解决办法
33万
查看次数

什么时候应该在C++ 11中使用constexpr功能?

在我看来,拥有"总是返回5的功能"正在破坏或淡化"调用函数"的含义.必须有一个原因,或者需要这种能力,或者它不会出现在C++ 11中.为什么会这样?

// preprocessor.
#define MEANING_OF_LIFE 42

// constants:
const int MeaningOfLife = 42;

// constexpr-function:
constexpr int MeaningOfLife () { return 42; }
Run Code Online (Sandbox Code Playgroud)

在我看来,如果我编写了一个返回字面值的函数,并且我进行了代码审查,有人会告诉我,我应该声明一个常量值而不是写回返5.

c++ constexpr c++11

322
推荐指数
9
解决办法
11万
查看次数

const vs constexpr关于变量

以下定义之间有区别吗?

const     double PI = 3.141592653589793;
constexpr double PI = 3.141592653589793;
Run Code Online (Sandbox Code Playgroud)

如果没有,在C++ 11中首选哪种风格?

c++ variables const constexpr c++11

275
推荐指数
5
解决办法
9万
查看次数

C中的MIN和MAX

在C中的位置MINMAX定义,如果有的话?

实现这些的最佳方式是什么,尽可能通用和安全?(首选编译器扩展/内置主流编译器.)

c max min c-preprocessor

265
推荐指数
11
解决办法
67万
查看次数

Constexpr与宏

我应该在哪里使用宏,哪里更喜欢constexpr?它们基本不一样吗?

#define MAX_HEIGHT 720
Run Code Online (Sandbox Code Playgroud)

VS

constexpr unsigned int max_height = 720;
Run Code Online (Sandbox Code Playgroud)

c++ macros constexpr c++11

54
推荐指数
3
解决办法
2万
查看次数

为什么在lambdas中隐式捕获const int(或short)?

这编译:

int main() {
    const int x = 123;
    auto g = []() { std::cout << x << "\n"; };
    g();
}
Run Code Online (Sandbox Code Playgroud)

但是这个:

int main(){
    const float x = 123;
    auto g = []() { std::cout << x << "\n"; };
    g();
}
Run Code Online (Sandbox Code Playgroud)

生产:

"错误:'x'未被捕获"

为什么?

我已经在GCC(各种版本从5.0.0到8.0.0)和Clang(各种版本从4.0.0到6.0.0)上测试过它.它在所有情况下都表现相同.

c++ lambda scope one-definition-rule language-lawyer

44
推荐指数
2
解决办法
1595
查看次数

constexpr const vs constexpr变量?

很明显constexpr意味着const,因此常见的是:

constexpr int foo = 42; // no const here
Run Code Online (Sandbox Code Playgroud)

但是,如果你写:

constexpr char *const str = "foo";
Run Code Online (Sandbox Code Playgroud)

然后,如果传递了-Wwrite-string标志,GCC将产生"警告:从字符串常量弃用转换为'char*'".

写作:

constexpr const char *const str = "foo";
Run Code Online (Sandbox Code Playgroud)

解决了这个问题.

那么constexpr const和constexpr真的一样吗?

c++ gcc const constexpr c++11

39
推荐指数
2
解决办法
1万
查看次数

正确使用const_cast <>

作为一个通用规则,const_cast<>()在C++代码中使用它通常被认为是一种不好的做法,因为它(大多数情况下)揭示了设计中的一个缺陷.

虽然我完全同意这种说法,但是我不知道什么是例使用const_cast<>()确定唯一的解决办法.

你能不能给我一些你认识/遇到过的例子?

非常感谢你.

c++ const-cast

38
推荐指数
5
解决办法
2万
查看次数

警告:ISO C++禁止将字符串常量转换为'char*'以获取静态`constexpr char*`数据成员

为什么此代码会返回警告

警告:ISO C++禁止将字符串常量转换为'char*'[ - WRrite-strings]

如果

在对象声明或非静态成员函数中使用的constexpr说明符(直到C++ 14)暗示const.函数或静态成员变量(自C++ 17)声明中使用的constexpr说明符暗示内联.

(cppreference.com)

#include <cassert>    
#include <string>    
#include <iostream>    

struct A     
{    
    // warning: ISO C++ forbids converting a string constant to ‘char*’    
    static constexpr char* name_ = "A";                           
    static constexpr char* name() { return name_; };             
};                                             

int main()    
{};    
Run Code Online (Sandbox Code Playgroud)

如果我添加一个constconstexpr,警告消失了:

#include <cassert>    
#include <string>    
#include <iostream>   



struct A     
{    
    static constexpr const char* name_ = "A";    
    static constexpr const char* name() { return name_; }; …
Run Code Online (Sandbox Code Playgroud)

c++ static constexpr c++11

31
推荐指数
2
解决办法
6634
查看次数

什么是C++中的constexpr?

我对一个constexpr概念感到困惑,因为我读过的constexpr是在编译时进行评估,因此它对于性能优化与正常情况相比非常有用const.

constexpr int i = 0;
constexpr int& ri = i;
Run Code Online (Sandbox Code Playgroud)

上面的代码返回一个错误"从'const int'类型的表达式中无效初始化类型'int&'的引用",为什么?

此外,下一个代码有一个错误:

constexpr int i = 0;
constexpr int* ri = &i;
Run Code Online (Sandbox Code Playgroud)

如果我替换了constexpr关键字const,以上所有都正常工作.

c++ const constexpr

17
推荐指数
3
解决办法
2122
查看次数