【发布时间】:2019-09-14 22:17:54
【问题描述】:
请参考这个sn-p:
#include <type_traits>
#include <string_view>
constexpr std::size_t strlen(char const* s) {
std::size_t n = 0;
while (*s++ != '\0')
++n;
return n;
}
template <std::size_t>
struct X {};
int main() {
constexpr auto pf = __PRETTY_FUNCTION__; // gcc ok; clang ok; (1)
static_assert(std::string_view(__PRETTY_FUNCTION__) == std::string_view("int main()")); // gcc ok; clang ok; (2)
X<strlen(__PRETTY_FUNCTION__)> x; // gcc not ok; clang ok; (3)
}
Clang 8 编译它,但 GCC 8.3 不编译。请参阅godbolt。 GCC 在(3) 上失败,尽管(1) 和(2) 行都可以。
如果我能够在(1) 中声明pf 并在static_assert 中使用__PRETTY_FUNCTION__,这意味着表达式__PRETTY_FUNCTION__ 是核心常量表达式。如果我不能声明X<strlen(__PRETTY_FUNCTION__)> x,这意味着strlen(__PRETTY_FUNCTION__) 不是一个整数常量表达式。
那么为什么strlen(__PRETTY_FUNCTION__) 不是一个整数常量表达式呢?它是标准暗示的,还是 GCC 的错误?
【问题讨论】:
-
afaik
__PRETTY_FUNCTION__不是标准 C++ -
注意:如果将
__PRETTY_FUNCTION__替换为定义为hello的constexpr char hello[] = "Hello, World!";,则可以:godbolt.org/z/mKw4HK -
@user463035818 我明白这一点,但它是如何声明的:比如
char const []或constexpr char const []。似乎任何一种方式都不适用。 -
我只是说它是一个扩展而不是一个错误:P
标签: c++ c++17 constant-expression