【发布时间】:2014-02-27 16:41:51
【问题描述】:
让我们举个简单的例子:
#include <iostream>
namespace foo {
constexpr int main(int argc, char* argv[]) {
// code
}
}
int main(int argc, char* argv[])
{
return foo::main(argc, argv);
}
取决于 code 是什么,clang 会抱怨或不抱怨。如果代码是:
cout << "Hello!";
return 0;
clang 抱怨:
错误:constexpr 函数从不产生常量表达式 [-Winvalid-constexpr]
constexpr int main(int argc, char* argv[]) {注意:非 constexpr 函数 'operator' 不能在常量表达式中使用
std::cout << "Hello!";/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)
正如我们所知,constexpr 函数不能包含任何 cout 语句。但是如果我们这样做会发生什么?
for (int i = 0; i < argc; i++)
std::cout << argv[i];
clang 允许它!好的,但这不可能是一个 constexpr 函数,即使它被标记为 constexpr,让我们尝试在 constexpr 上下文中使用它。
int arr[foo::main(argc, argv)];
有效!所以一定是clang bug?我之所以说 clang 是因为 gcc 抱怨:
错误:constexpr 函数体 'constexpr int foo::main(int, char**)' 不是返回语句
所以我的结论是clang是错的,gcc是对的。
【问题讨论】:
-
在 clang 3.4 上生成“constexpr 函数中不允许的语句”。
-
你用的是什么版本的clang?
-
我正在使用 clang 3.5
std=c++1y -
我什至不认为 clang 通常允许 constexpr
-
@ToryWebster 那么你为什么要标记这个
c++11?您的问题的答案取决于它。