constexpr和之间有什么区别const?
在我看来,拥有"总是返回5的功能"正在破坏或淡化"调用函数"的含义.必须有一个原因,或者需要这种能力,或者它不会出现在C++ 11中.为什么会这样?
// preprocessor.
#define MEANING_OF_LIFE 42
// constants:
const int MeaningOfLife = 42;
// constexpr-function:
constexpr int MeaningOfLife () { return 42; }
在我看来,如果我编写了一个返回字面值的函数,并且我进行了代码审查,有人会告诉我,我应该声明一个常量值而不是写回返5.
我的同事是0 2上的问题,他一直激励着(1,2),所以我想我应该给他一个机会,迎头赶上.
我们最近的分歧是关于将"const"放在声明上的样式问题.
他认为它应该在类型前面,或者在指针之后.原因在于,这是其他人通常所做的事情,其他风格可能会让人感到困惑.因此,指向常量int的指针和指向int的常量指针将分别为:
const int *i;
      int * const i;
但是,无论如何我很困惑.我需要的是一致的,易于理解的规则,我可以做的"常量"意义上的唯一方法是,它去后,它被修改的事情.有一个例外允许它在最终类型前面,但这是一个例外,所以如果我不使用它,它会更容易.
因此,指向常量int的指针和指向int的常量指针将分别为:
int const * i;
int * const i;
作为一个额外的好处,以这种方式做事使得更深层次的间接更容易理解.例如,指向int的常量指针的指针显然是:
int * const * i;
我的论点是,如果有人只是按照自己的方式学习,他们就可以轻松搞清楚上面的内容.
这里的最终问题是他认为将int放在int之后是如此难以言喻的丑陋,对可读性有害,以至于它应该在样式指南中被禁止.当然,我认为如果指南应该建议按照我的方式做,但无论哪种方式,我们都不应该禁止一种方法.
编辑: 我已经得到了很多好的答案,但没有一个真正直接解决我的最后一段("最终问题").很多人都争论一致性,但在这种情况下是如此理想,禁止其他方式这样做是一个好主意,而不是仅仅劝阻它?
我对一个constexpr概念感到困惑,因为我读过的constexpr是在编译时进行评估,因此它对于性能优化与正常情况相比非常有用const.
constexpr int i = 0;
constexpr int& ri = i;
上面的代码返回一个错误"从'const int'类型的表达式中无效初始化类型'int&'的引用",为什么?
此外,下一个代码有一个错误:
constexpr int i = 0;
constexpr int* ri = &i;
如果我替换了constexpr关键字const,以上所有都正常工作.
在另一个问题的讨论中,我得到一个例子,显然标识符的链接在常量表达式中影响了它的可用性:
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
}
最后一个错误(使用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";
                ^
我可能在前面的讨论中错过了这个例子的重要性,因为我认为它不可能仅仅是与之不同的foo<a>联系 …
以下代码无法在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;
将const声明替换为kPiwith constexpr,它会成功编译.
在另一方面,如果int是用来代替double,好像const 还有戏剧与constexpr …
我是C++的新手.我正在阅读一本C++书
const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal
它说浮动变量的声明在编译期间是无效的.为什么?
假设我们使用
int i = 3;
float f[i];
有用.
第一种情况有什么问题?
谢谢.
我试着写ac程序如下?
const int x = 5;
int main()
{
    int arr[x] = {1, 2, 3, 4, 5};
}
当我尝试使用gcc进行编译时,这会发出警告,如下所示.
simple.c:9:错误:可能无法初始化变量大小的对象.
但是C++允许这样做.当我将x作为数组大小传递时,为什么x不被视为常量?
我知道constexpr 变量可以在编译时使用.例如,对于模板或静态asser.
但如果我想在没有constexpr的情况下这样做,我可以static const.
什么是自C++ 11/14引入constexpr之间的区别
constexpr int a = 3;
//AND
static const int a = 3;
谢谢!
另一种看待这个问题的方法是我应该使用哪种方法?
我遇到了一个奇怪的案例。
// 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;
}
有什么特别之处double所以它不能constexpr工作?
c++ ×10
constexpr ×6
c++11 ×5
const ×4
c ×1
coding-style ×1
compilation ×1
double ×1
integer ×1