- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
如果(成员)函数模板 f(T &)
没有其他重载(例如 f(volatile T &&)
或 template< typename T > f(T &&);
) , 然后 T &&
是所谓的转发引用,T
是 U
, 或 U &
对于某些 cv-qualified 类型 U
.但是对于成员函数的 cv-ref-qualifiers 则没有这样的规则。在 struct S { void f() && { ; } };
一个S::f()
始终具有右值引用限定符。
在通用代码中,避免定义某些成员函数的 4(甚至 8,如果我们还考虑 volatile
限定符)重载将非常有用,以防所有成员函数都做同样的事情。
以这种方式出现的另一个问题是,不可能定义 *this
的有效 cv-ref-qualifier在某种意义上。以下代码不允许确定成员函数的ref-qualifier operator ()
是&&
的 &
.
#include <type_traits>
#include <utility>
#include <iostream>
#include <cstdlib>
#define P \
{ \
using this_ref = decltype((*this)); \
using this_type = std::remove_reference_t< this_ref >; \
std::cout << qual() << ' ' \
<< (std::is_volatile< this_type >{} ? "volatile " : "") \
<< (std::is_const< this_type >{} ? "const " : "") \
<< (std::is_lvalue_reference< this_ref >{} ? "&" : "&&") \
<< std::endl; \
}
struct F
{
constexpr int qual() & { return 0; }
constexpr int qual() const & { return 1; }
constexpr int qual() && { return 2; }
constexpr int qual() const && { return 3; }
constexpr int qual() volatile & { return 4; }
constexpr int qual() volatile const & { return 5; }
constexpr int qual() volatile && { return 6; }
constexpr int qual() volatile const && { return 7; }
void operator () () & P
void operator () () const & P
void operator () () && P
void operator () () const && P
void operator () () volatile & P
void operator () () volatile const & P
void operator () () volatile && P
void operator () () volatile const && P
};
int
main()
{
{
F v;
F const c{};
v();
c();
std::move(v)();
std::move(c)();
}
{
volatile F v;
volatile F const c{};
v();
c();
std::move(v)();
std::move(c)();
}
return EXIT_SUCCESS;
}
但是如果有上面的语法就好了。 IE。 decltype((*this))
表示 *this
的 cv-ref-qualified 类型.在我看来,将这种语法引入即将到来的 C++ 标准版本并不是什么重大改变。但是&&
因为 转发 cv-ref-qualifier 是(而且它看起来像是委员会(即核心语言工作组)的遗漏)。
另一个序列可以表示*this
的成员函数cv-ref-qualifier 和cv-ref-qualified 类型。进入它的 body :auto &&
, decltype(&&)
等
是否有关于此问题的提案,准备在 C++17 中使用?
最佳答案
是的,有这样的提议。
背景:
因为我们已经在模板函数中有转发引用,你可以简单地将你的成员函数变成一个模板友元函数(并通过 enable_if
保护它不被 F 以外的任何其他类使用
,如果需要的话)。
现在,也许您真的非常想将函数用作成员函数,因为您真的非常喜欢这种语法。
提案:
查询统一调用语法建议,例如:n4174
如果类似的东西被接受,你将能够使用自由函数,比如第一个参数的成员函数。这将涵盖您在第一条评论中链接的示例代码。不可否认,它不会涵盖 operator(),但我认为与编写 8 个重载相比,这是一个小麻烦 :-)
关于c++ - 转发成员函数的 cv-ref-qualifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32859418/
根据这个answer ,下面的代码应该没有错误地编译: #include namespace { struct A { int i; }; volatile A a{}; static_assert
我了解导入 Data.List。 但是 importqualified Data.List 语句中的 qualified 是什么意思? 最佳答案 合格的导入使导入的实体仅以合格的形式可用,例如 imp
我正在尝试创建一个组件,该组件将接受一个特定的 bean (fasterxml ObjectMapper)。 如果有一个名为 qualifiedObjectMapper 的限定 bean,我想使用那个
我一直在编写以下代码来支持对右值的函数调用,而不必 std::move明确地在返回值上。 struct X { X& do_something() & { // some co
我正在尝试使用 GCC 编译器编译以下代码 class Class { public: uInt16 temp; const uInt32 function() const; } inline
我试图理解为什么我的编译器警告我有关此代码: static const char *const _menuMain_Strings_1[] __ATTR_PROGMEM__ = { _menuMai
我正在尝试将 Spring 4.x.x 迁移到 Spring boot,它依赖于外部 spring 2.5 jar 中的类。我已经进行了所有 Autowiring 更改,下面是我的应用程序类 @Spr
我从 eclipse git 中查看了最新的源代码:git://git.eclipse.org/gitroot/platform/eclipse.platform.releng.aggregator.
我发现许多门户网站都解释了类似的问题。但我想这是独特的情况。我在 spring mvc 应用程序中遇到错误。 org.springframework.beans.factory.Unsatisfied
我有下面的代码: package far.botshop.backend.controller; /** */ import java.util.logging.Logger; import far
我有 3 个数据源,设置如下: @Configuration @Component public class DataSourceConfig { @Bean("foo") @Conf
如何添加限定符来区分这两个 bean?我知道我需要使用 @Qualifier 注释,但我不确定如何将它添加到 bean 中,然后如何引用适当的 bean 创建 Autowiring 对象。 @Conf
@Override @Autowired(required = true) @Qualifier("hibernateCriteriaBuilder") public void setCriteria
我有 Circle 类: public class Circle { @Autowired @Qualifier("pointA") private Point center;
我在 Java Spring 环境中工作,并且在让 @Qualifier 工作时遇到了问题。我们项目的其他部分正在使用 @Inject 获取一个 bean,但我需要同一个 bean 的两个版本,看起来
“qualifier”的含义是什么?“qualifier”和“keyword”之间的区别是什么? 对于C语言中的volatile限定词,我们可以说volatile是一个关键字,那么“qualifier
我有一个简单的宏来设置一些常见的标题和格式: Dim colString(1 To 17, 1 To 2) As String Dim i As Integer colString(1, 1) = "
我正在将 Teradata 转换为 Hive(版本 0.10.0)。 Teradata 查询: QUALIFY ROW_NUMBER() OVER (PARTITION BY ADJSTMNT,SRC
我是在 PHP 中使用命名空间的新手,它们看起来很简单。然而,当我在一个包含类、接口(interface)和闭包的大文件的顶部添加一个命名空间时,代码完全停止工作。显然,某些元素没有正确限定。 例如:
我正在尝试使用属性占位符作为@Qualifier 的属性,如下所示: @Autowired @Qualifier("${beanName}") private MyBean myBean; 但是,这不
我是一名优秀的程序员,十分优秀!