当前位置: 首页 > 知识库问答 >
问题:

STD::Declval()在GCC中触发带有警告的断言错误

慕逸仙
2023-03-14

请考虑以下片段:

#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;
}
main.cpp: In instantiation of ‘decltype (foo<T>()) bar(T) [with T = int; decltype (foo<T>()) = int]’:
main.cpp:12:7:   required from here
main.cpp:8:2: warning: no return statement in function returning non-void [-Wreturn-type]
 {}
  ^
In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/bits/move.h:57:0,
                 from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/bits/stl_pair.h:59,
                 from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/utility:70,
                 from main.cpp:1:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/type_traits: In instantiation of ‘typename std::add_rvalue_reference< <template-parameter-1-1> >::type std::declval() [with _Tp = int; typename std::add_rvalue_reference< <template-parameter-1-1> >::type = int&&]’:
main.cpp:8:2:   required from ‘decltype (foo<T>()) bar(T) [with T = int; decltype (foo<T>()) = int]’
main.cpp:12:7:   required from here
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.1/include/g++-v4/type_traits:1871:7: error: static assertion failed: declval() must not be used!
       static_assert(__declval_protector::__stop,

如果禁用警告或为提供返回语句,例如,

template <typename T>
decltype(foo<T>()) bar(T a)
{
    return a + a;
}

断言失败消失。Clang++3.3在任何情况下都不会触发断言错误。这种行为是否符合海湾合作委员会的标准?

共有1个答案

姜弘化
2023-03-14

我的GCC4.9版本是在6月初构建的,只要我在函数中添加return{};throw;,就可以毫无怨言地编译它。如果没有返回,它就会激发静态断言。这当然是一个bug,但只是一个次要的bug,因为函数只在执行时“崩溃”。

我在试图在常量表达式中执行declval()时看到过这个错误,所以在您的例子中可能会发生类似的情况。“不能使用”大概是指网上解决使用或使用结果。

也许在没有任何语句的情况下,它试图用decltype的内容制造一个语句。即使添加一个简单的语句,如0;也可以抑制虚假错误。(但是static_assert(true,“”)甚至void(0)都是不够的。)

提交了一个GCC窃听器。

 类似资料:
  • 我有一个名为的类,它扩展了接口和。但是,当我使用该类并且不调用它的方法时,不会触发存在资源泄漏的警告。我还有一个名为的类,它有一个名为的方法,返回一个对象。当我以以下方式创建一个新的对象时,不会触发任何资源泄漏警告:

  • 我想启用 - 从字面上看 - GCC的所有警告。(你会认为这很容易... > < li> 您可能会认为-Wall可能会成功,但事实并非如此!你仍然需要-Wextra。 你会认为可能会成功,但没有!并非此处列出的所有警告(例如-Wshadow)都由此启用。我仍然不知道这个列表是否全面。 我如何告诉GCC启用(没有if,and,or but!)它拥有的所有警告?

  • 我使用hikaricp作为我的数据库连接池。当我完成我的SQL语句时,我将关闭连接,在连接上调用关闭,我相信您应该将连接代理返回到池。然而,我看到以下警告(不是错误)消息,我不得不怀疑这是否是一个需要解决的问题,因为我没有正确清理我的连接资源。我不是使用资源尝试,而是使用尝试捕获最后(我在最后关闭连接

  • 我管理一切都很好,创建了一个通知服务,用于作为警报的结果触发通知。不幸的是,使用AlarmManager设置警报不能正常工作。它会在几分钟后触发(而不是几小时,这将表示时区问题)。循环周期为1周,所以我使用了常数INTERVAL_DAY,并将其乘以7。为了确保一个PendingIntent不会替换另一个,我将dayOfWeek作为第二个参数传递给PendingIntent.getService()

  • 我在代码的不同地方使用< code>std::bind时遇到了很多问题。有时行得通,有时行不通,所以我认为我正在做一些根本错误的事情。 据我所知,的以下基本用法应该可以正常使用: 当然< code>bar_auto的类型是< code>std::function 它类似于这个bug,但是它太老了,我不认为它是相关的。 gcc的输出并不特别有启发性: 在文件中包含从bindnew.cpp: 1:0: