考虑这个片段:
#include <utility>
template <typename U>
auto foo() -> decltype(std::declval<U>() + std::declval<U>());
template <typename T>
decltype(foo<T>()) bar(T)
{}
int main()
{
bar(1);
return 0;
}
这会在使用-Wall -Wextra
. 例如,这是 4.8.1 的输出:
main.cpp: 在 'decltype (foo<T>()) bar(T) [with T = int; decltype (foo<T>()) = int]': main.cpp:12:7:从这里需要 main.cpp:8:2:警告:函数中没有返回语句返回非 void [-Wreturn-type] {} ^ 在 /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/bits/move.h:57:0 包含的文件中, 来自 /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/bits/stl_pair.h:59, 来自 /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/utility:70, 来自 main.cpp:1: /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/type_traits:在 'typename std::add_rvalue_reference< <template-parameter-1-1> >::type 的实例化中std::declval() [with _Tp = int; 类型名 std::add_rvalue_reference<<template-parameter-1-1> >::type = int&&]': main.cpp:8:2: 'decltype (foo<T>()) bar(T) [with T = int; decltype (foo<T>()) = int]' main.cpp:12:7:从这里需要 /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/type_traits:1871:7: 错误:静态断言失败:不能使用 declval()! static_assert(__declval_protector::__stop,
如果有人禁用警告或提供bar
返回语句,例如,
template <typename T>
decltype(foo<T>()) bar(T a)
{
return a + a;
}
断言失败消失。Clang++ 3.3 在任何情况下都不会触发断言错误。这是来自 GCC 的符合标准的行为吗?