相关疑难解决方法(0)

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

constexpr和之间有什么区别const

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

c++ const constexpr c++11

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

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万
查看次数

是否可以在constexpr中使用std :: string?

使用C++ 11,Ubuntu 14.04,GCC默认工具链.

此代码失败:

constexpr std::string constString = "constString";
Run Code Online (Sandbox Code Playgroud)

错误:constexpr变量'constString'的类型'const string {aka const std :: basic_string}'不是文字...因为......'std :: basic_string'有一个非平凡的析构函数

是否有可能使用std::stringconstexpr?(显然不是......)如果是这样,怎么样?是否有另一种方法在一个字符串中使用字符串constexpr

stdstring constexpr c++11

142
推荐指数
5
解决办法
8万
查看次数

编译时间字符串散列

我在几个不同的地方读过,使用C++ 11的新字符串文字,可以在编译时计算字符串的哈希值.然而,似乎没有人准备出来说它将是可能的或如何完成.

  • 这可能吗?
  • 操作员会是什么样子?

我特别感兴趣的是这样的用例.

void foo( const std::string& value )
{
   switch( std::hash(value) )
   {
      case "one"_hash: one(); break;
      case "two"_hash: two(); break;
      /*many more cases*/
      default: other(); break;
   }
}
Run Code Online (Sandbox Code Playgroud)

注意:编译时哈希函数不必像我编写的那样完全.我尽力猜测最终解决方案的样子,但meta_hash<"string"_meta>::value也可能是一个可行的解决方案.

c++ hash metaprogramming c++11

95
推荐指数
10
解决办法
4万
查看次数

enum vs constexpr用于类中的实际静态常量

让我先说明我的意图.在旧的(C++)时代,我们会有如下代码:

class C
{
public:
  enum {SOME_VALUE=27};
};
Run Code Online (Sandbox Code Playgroud)

然后我们可以SOME_VALUE在整个代码中使用编译时常量,无论编译器在哪里看C::SOME_VALUE,它都只是插入文字27.

现在,将代码更改为以下内容似乎更为可接受:

class C
{
public:
  static constexpr int SOME_VALUE=27;
};
Run Code Online (Sandbox Code Playgroud)

这看起来更清晰,提供SOME_VALUE了一个定义良好的类型,并且似乎是C++ 11中的首选方法.(至少对我来说不可靠)问题是,这也导致SOME_VALUE需要在外部进行的情况.也就是说,在某个地方的某个cpp文件中,我们需要添加:

constexpr int C::SOME_VALUE; // Now C::SOME_VALUE has external linkage
Run Code Online (Sandbox Code Playgroud)

导致这种情况的情况似乎是在使用const引用时SOME_VALUE,这在C++标准库代码中经常发生(请参阅本问题底部的示例).顺便说一句,我使用gcc 4.7.2作为我的编译器.

由于这种困境,我被迫恢复定义SOME_VALUE为枚举(即旧学校),以避免必须为某些(但不是所有)静态constexpr成员变量的cpp文件添加定义.是不是有某种方法告诉编译器这constexpr int SOME_VALUE=27意味着SOME_VALUE应该将其视为编译时常量而不是具有外部链接的对象?如果您看到与它一起使用的const引用,请创建一个临时引用.如果你看到它的地址,如果需要的话就会产生编译时错误,因为它是编译时常量而已.

以下是一些看似良性的示例代码,它们使我们需要SOME_VALUE在cpp文件中添加定义(再次使用gcc 4.7.2进行测试):

#include <vector>

class C
{
public:
  static constexpr int SOME_VALUE=5;
};

int main()
{
  std::vector<int> iv;

  iv.push_back(C::SOME_VALUE); // Will cause an undefined reference …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr c++11

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

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万
查看次数

constexpr和endianness

在C++编程领域不时出现的一个常见问题是字节序的编译时确定.通常这是通过几乎不可移植的#ifdef来完成的.但是C++ 11 constexpr关键字和模板专业化是否为我们提供了更好的解决方案?

做以下事情是合法的C++ 11:

constexpr bool little_endian()
{
   const static unsigned num = 0xAABBCCDD;
   return reinterpret_cast<const unsigned char*> (&num)[0] == 0xDD;
}
Run Code Online (Sandbox Code Playgroud)

然后专门为两种endian类型设置模板:

template <bool LittleEndian>
struct Foo 
{
  // .... specialization for little endian
};

template <>
struct Foo<false>
{
  // .... specialization for big endian
};
Run Code Online (Sandbox Code Playgroud)

然后做:

Foo<little_endian()>::do_something();
Run Code Online (Sandbox Code Playgroud)

c++ endianness c++11

26
推荐指数
5
解决办法
4930
查看次数

(&) - 括号中的&符号 - 在此代码中是什么意思?

这个答案中,给出了以下代码(C++ 11):

template <typename T, size_t N>
constexpr size_t size_of(T (&)[N]) {
    return N;
}
Run Code Online (Sandbox Code Playgroud)

(&)在这种背景下意味着什么?这种事情非常难以搜索.

c++ c++11

18
推荐指数
2
解决办法
1447
查看次数

在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
查看次数

声明constexpr函数或方法

我想知道是否有必要声明constexpr函数和方法的限制,就像内联函数和方法一样.

我知道必须在头文件中编写内联函数或方法,以使编译器能够访问它们被调用的定义.如果constexpr有类似的东西会有意义,但我无法找到关于这一点的任何东西......

基本上我的问题是:

  • 我是否可以在头文件中编写constexpr函数的定义而不会冒重复符号的风险?

  • 我可以分离constexpr函数或方法的声明和定义吗?

c++ constexpr c++11

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