constexpr和之间有什么区别const?
以下定义之间有区别吗?
const double PI = 3.141592653589793;
constexpr double PI = 3.141592653589793;
Run Code Online (Sandbox Code Playgroud)
如果没有,在C++ 11中首选哪种风格?
使用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::string的constexpr?(显然不是......)如果是这样,怎么样?是否有另一种方法在一个字符串中使用字符串constexpr?
我在几个不同的地方读过,使用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++)时代,我们会有如下代码:
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) 我应该在哪里使用宏,哪里更喜欢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++编程领域不时出现的一个常见问题是字节序的编译时确定.通常这是通过几乎不可移植的#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++ 11):
template <typename T, size_t N>
constexpr size_t size_of(T (&)[N]) {
return N;
}
Run Code Online (Sandbox Code Playgroud)
(&)在这种背景下意味着什么?这种事情非常难以搜索.
我是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)
有用.
第一种情况有什么问题?
谢谢.
我想知道是否有必要声明constexpr函数和方法的限制,就像内联函数和方法一样.
我知道必须在头文件中编写内联函数或方法,以使编译器能够访问它们被调用的定义.如果constexpr有类似的东西会有意义,但我无法找到关于这一点的任何东西......
基本上我的问题是:
我是否可以在头文件中编写constexpr函数的定义而不会冒重复符号的风险?
我可以分离constexpr函数或方法的声明和定义吗?
c++ ×9
c++11 ×9
constexpr ×6
const ×3
compilation ×1
endianness ×1
hash ×1
macros ×1
stdstring ×1
variables ×1