constexpr 的目的
Purpose of constexpr
这更像是一个哲学问题,而不是实际的代码片段,但也许 C++ 专家可以启发我(如果已经有人问过,我深表歉意)。
我一直在阅读 Meyers 的 "Effective Modern C++" 书中的第 15 项,以及这个线程:implicit constexpr?(加上合理数量的谷歌搜索)。该项目详细介绍了 constexpr
表达式的用法,即它定义了 可以 return 给定编译时输入的编译时值的函数。
此外,我提到的 Whosebug 线程表明,某些编译器完全有能力自行确定哪些函数调用结果在编译时是已知的。
因此问题来了:为什么要将 constexpr
添加到标准中,而不是定义编译器何时应派生并允许 static/compile-time 值?
我意识到它使各种仅编译(例如 std::array<T, constexpr>
)定义更不可预测,但另一方面,根据迈耶斯的书,constexpr 是接口的一部分。 ..,如果你删除它,你可能会导致任意大量的客户端代码停止编译。
因此,不仅具有明确的 constexpr 需要人们记住添加它,它还为接口添加了永久语义。
澄清:这个问题不是关于为什么要使用constexpr
。我很欣赏以编程方式导出编译时值的能力非常有用,并且我自己在很多场合都使用过它。这是一个问题,为什么在编译器可能自行推断常量时间行为的情况下它是强制性的。
澄清号。 2:这是一个代码片段,显示编译器不会自动推断,我在这种情况下使用了 g++。
#include <array>
size_t test()
{
return 42;
}
int main()
{
auto i = test();
std::array<int, i> arrayTst;
arrayTst[1] = 20;
return arrayTst[1];
}
std::array
声明无法编译,因为我没有将 test()
定义为 constexpr
,这当然符合标准。如果标准不同,没有什么可以阻止 gcc 独立地弄清楚 test()
总是 return 是一个常量表达式。
这个问题不是问"what the standard defines",而是"why the standard is the way it is"?
在 constexpr
之前,编译器有时可以计算出编译时间常量并使用它。然而,程序员永远不知道这会在什么时候发生。
之后,如果表达式不是编译时常量,程序员会立即收到通知,并且他或她意识到需要修复它。
这更像是一个哲学问题,而不是实际的代码片段,但也许 C++ 专家可以启发我(如果已经有人问过,我深表歉意)。
我一直在阅读 Meyers 的 "Effective Modern C++" 书中的第 15 项,以及这个线程:implicit constexpr?(加上合理数量的谷歌搜索)。该项目详细介绍了 constexpr
表达式的用法,即它定义了 可以 return 给定编译时输入的编译时值的函数。
此外,我提到的 Whosebug 线程表明,某些编译器完全有能力自行确定哪些函数调用结果在编译时是已知的。
因此问题来了:为什么要将 constexpr
添加到标准中,而不是定义编译器何时应派生并允许 static/compile-time 值?
我意识到它使各种仅编译(例如 std::array<T, constexpr>
)定义更不可预测,但另一方面,根据迈耶斯的书,constexpr 是接口的一部分。 ..,如果你删除它,你可能会导致任意大量的客户端代码停止编译。
因此,不仅具有明确的 constexpr 需要人们记住添加它,它还为接口添加了永久语义。
澄清:这个问题不是关于为什么要使用constexpr
。我很欣赏以编程方式导出编译时值的能力非常有用,并且我自己在很多场合都使用过它。这是一个问题,为什么在编译器可能自行推断常量时间行为的情况下它是强制性的。
澄清号。 2:这是一个代码片段,显示编译器不会自动推断,我在这种情况下使用了 g++。
#include <array>
size_t test()
{
return 42;
}
int main()
{
auto i = test();
std::array<int, i> arrayTst;
arrayTst[1] = 20;
return arrayTst[1];
}
std::array
声明无法编译,因为我没有将 test()
定义为 constexpr
,这当然符合标准。如果标准不同,没有什么可以阻止 gcc 独立地弄清楚 test()
总是 return 是一个常量表达式。
这个问题不是问"what the standard defines",而是"why the standard is the way it is"?
在 constexpr
之前,编译器有时可以计算出编译时间常量并使用它。然而,程序员永远不知道这会在什么时候发生。
之后,如果表达式不是编译时常量,程序员会立即收到通知,并且他或她意识到需要修复它。