小编Tor*_*ter的帖子

为什么主要不能成为constexpr?

当您尝试使用constexpr时,main如下所示:

constexpr int main()
Run Code Online (Sandbox Code Playgroud)

gcc和clang抱怨:

错误:无法声明':: main'为内联

错误:'main'不允许声明为constexpr

让我们看看constexpr函数的要求是什么:

constexpr函数必须满足以下要求:

  • 它不能是虚拟的
  • 它的返回类型必须是LiteralType
  • 它的每个参数必须是文字类型

什么是LiteralType?

文字类型是以下任何一种

  • void(因为c ++ 14)
  • 标量类型
  • 参考类型
  • 一个文字类型的数组

功能主体必须包括什么?

  • 空语句
  • static_assert声明
  • typedef声明和不定义类或枚举的别名声明
  • 使用声明
  • 使用指令
  • 正好一个只包含文字值,constexpr变量和函数的return语句.

以下示例:

constexpr int main() { ; }

constexpr int main() { return 42; }

constexpr int main() {
// main defaults to return 0 
}
Run Code Online (Sandbox Code Playgroud)

似乎符合所有这些要求.还有这个,main是在程序开始之前运行的特殊功能.您可以从main运行constexpr函数,并且为了将constexpr标记为constexpr,它必须在constexpr上下文中运行.

那么为什么main不允许成为constexpr?

c++ program-entry-point language-lawyer constexpr c++11

20
推荐指数
3
解决办法
1510
查看次数

clang中的constexpr错误但不是gcc中的错误?

我们来看一个这个简单的例子:

#include <iostream>

namespace foo {
    constexpr int main(int argc, char* argv[]) {
      // code
    }
}

int main(int argc, char* argv[])
{
    return foo::main(argc, argv);
}
Run Code Online (Sandbox Code Playgroud)

取决于代码是什么,clang会抱怨或不抱怨.如果代码是:

cout << "Hello!";
return 0;
Run Code Online (Sandbox Code Playgroud)

clang抱怨:

错误:constexpr函数永远不会产生常量表达式[-Winvalid-constexpr]

constexpr int main(int argc, char* argv[]) {
Run Code Online (Sandbox Code Playgroud)

注意:非constexpr函数'operator <<>'不能用于常量表达式

    std::cout << "Hello!";
Run Code Online (Sandbox Code Playgroud)

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ostream:530:5:注意:在这里声明

operator<<(basic_ostream<char, _Traits>& __out, const char* __s)
Run Code Online (Sandbox Code Playgroud)

很公平,constexpr函数不能包含任何cout语句,我们知道.但是如果我们这样做会发生什么?

  for (int i = 0; i < argc; i++)
    std::cout << argv[i];
Run Code Online (Sandbox Code Playgroud)

clang允许它!好吧,但这不可能是一个constexpr函数,即使它被标记为constexpr,让我们尝试在constexpr上下文中使用它.

int arr[foo::main(argc, argv)];
Run Code Online (Sandbox Code Playgroud)

有用!那一定是cla​​ng bug?我之所以说clang是因为gcc抱怨:

错误:constexpr函数的主体'constexpr int foo :: main(int,char**)'不是return语句 …

c++ clang constexpr c++14

5
推荐指数
2
解决办法
4441
查看次数