相关疑难解决方法(0)

`constexpr`和`const`之间的区别

constexpr和之间有什么区别const

  • 我什么时候才能只使用其中一个?
  • 我何时可以同时使用这两种方法?如何选择?

c++ const constexpr c++11

540
推荐指数
9
解决办法
19万
查看次数

什么时候应该在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万
查看次数

在类型ID可接受的C++中是"const"吗?

我的同事是0 2上的问题,他一直激励着(1,2),所以我想我应该给他一个机会,迎头赶上.

我们最近的分歧是关于将"const"放在声明上的样式问题.

他认为它应该在类型前面,或者在指针之后.原因在于,这是其他人通常所做的事情,其他风格可能会让人感到困惑.因此,指向常量int的指针和指向int的常量指针将分别为:

const int *i;
      int * const i;
Run Code Online (Sandbox Code Playgroud)

但是,无论如何我很困惑.我需要的是一致的,易于理解的规则,我可以做的"常量"意义上的唯一方法是,它去后,它被修改的事情.有一个例外允许它在最终类型前面,但这是一个例外,所以如果我不使用它,它会更容易.

因此,指向常量int的指针和指向int的常量指针将分别为:

int const * i;
int * const i;
Run Code Online (Sandbox Code Playgroud)

作为一个额外的好处,以这种方式做事使得更深层次的间接更容易理解.例如,指向int的常量指针的指针显然是:

int * const * i;
Run Code Online (Sandbox Code Playgroud)

我的论点是,如果有人只是按照自己的方式学习,他们就可以轻松搞清楚上面的内容.

这里的最终问题是他认为将int放在int之后是如此难以言喻的丑陋,对可读性有害,以至于它应该在样式指南中被禁止.当然,我认为如果指南应该建议按照我的方式做,但无论哪种方式,我们都不应该禁止一种方法.

编辑: 我已经得到了很多好的答案,但没有一个真正直接解决我的最后一段("最终问题").很多人都争论一致性,但在这种情况下是如此理想,禁止其他方式这样做是一个好主意,而不是仅仅劝阻它?

c++ coding-style

25
推荐指数
7
解决办法
7939
查看次数

什么是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
查看次数

为什么外部链接变量可用作常量表达式?

在另一个问题的讨论中,我得到一个例子,显然标识符的链接在常量表达式中影响了它的可用性:

extern char const a[] = "Alpha";
char constexpr b[] = "Beta";
char const g[] = "Gamma";

template <const char *> void foo() {}

auto main()
    -> int
{
    foo<a>();     // Compiles
    foo<b>();     // Compiles
    foo<g>();     // Doesn't compile
}
Run Code Online (Sandbox Code Playgroud)

最后一个错误(使用GCC)是:

test.cc: In function 'int main()':
test.cc:12:13: error: the value of 'g' is not usable in a constant expression
         foo<g>();     // Doesn't compile
             ^
test.cc:3:16: note: 'g' was not declared 'constexpr'
     char const g[] = "Gamma";
                ^
Run Code Online (Sandbox Code Playgroud)

我可能在前面的讨论中错过了这个例子的重要性,因为我认为它不可能仅仅是与之不同的foo<a>联系 …

c++

15
推荐指数
1
解决办法
413
查看次数

使用const初始化constexpr:int和double的不同处理

以下代码无法在Ideone上实时编译:

#include <iostream>
using namespace std;

int main() {
    const double kPi = 3.14;
    constexpr double kPi2 = 2.0*kPi;
    cout << kPi2;
}
Run Code Online (Sandbox Code Playgroud)

错误消息是:

prog.cpp: In function 'int main()':
prog.cpp:6:30: error: the value of 'kPi' is not usable in a constant expression
  constexpr double kPi2 = 2.0*kPi;
                              ^
prog.cpp:5:15: note: 'kPi' was not declared 'constexpr'
  const double kPi = 3.14;
Run Code Online (Sandbox Code Playgroud)

const声明替换为kPiwith constexpr,它会成功编译.

在另一方面,如果int是用来代替double,好像const 还有戏剧constexpr …

c++ const constexpr c++11

14
推荐指数
1
解决办法
1310
查看次数

在c ++中使用const

我是C++的新手.我正在阅读一本C++书

const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal
Run Code Online (Sandbox Code Playgroud)

它说浮动变量的声明在编译期间是无效的.为什么?

假设我们使用

int i = 3;
float f[i];
Run Code Online (Sandbox Code Playgroud)

有用.

第一种情况有什么问题?

谢谢.

c++ compiler-errors compilation const

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

为什么在C中不允许将数组的大小作为常量变量但在C++中允许?

我试着写ac程序如下?

const int x = 5;

int main()
{
    int arr[x] = {1, 2, 3, 4, 5};
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用gcc进行编译时,这会发出警告,如下所示.

simple.c:9:错误:可能无法初始化变量大小的对象.

但是C++允许这样做.当我将x作为数组大小传递时,为什么x不被视为常量?

c c++

8
推荐指数
3
解决办法
3910
查看次数

静态const和constexpr变量有什么区别?

我知道constexpr 变量可以在编译时使用.例如,对于模板或静态asser.

但如果我想在没有constexpr的情况下这样做,我可以static const.

什么是自C++ 11/14引入constexpr之间的区别

constexpr int a = 3;
//AND
static const int a = 3;
Run Code Online (Sandbox Code Playgroud)

谢谢!

另一种看待这个问题的方法是我应该使用哪种方法?

c++ static-variables constexpr c++11

7
推荐指数
1
解决办法
1217
查看次数

C++ 中的 constexpr int 和 constexpr double

我遇到了一个奇怪的案例。

// this does not work, and reports:
// constexpr variable 'b' must be initialized by a constant expression
int main() {
  const double a = 1.0;
  constexpr double b = a;
  std::cout << b << std::endl;
}

// this works...
int main() {
  const int a = 1;
  constexpr int b = a;
  std::cout << b << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

有什么特别之处double所以它不能constexpr工作?

c++ double integer constexpr c++11

7
推荐指数
1
解决办法
744
查看次数