我观察到,如果我只显式删除一个类的构造函数和析构函数,那么结果实现将删除复制构造函数&移动构造函数,但编译器仍然使复制赋值和移动赋值运算符隐式可用!这反过来使分配成为可能!
我的问题是这是什么理由?可以使用它的用例是什么。以下是一个示例代码供参考:
# ifndef MOEGLICH_H_
# define MOEGLICH_H_
# include <cstdint>
class Moeglich final
{
public :
explicit
Moeglich() = delete ;
~Moeglich() = delete ;
/*
// With explicit deletion
Moeglich& operator=(const Moeglich& other) = delete ;
Moeglich(const Moeglich& other) = delete ;
Moeglich&& operator=(Moeglich&& other) = delete ;
Moeglich(Moeglich&& other) = delete ;
*/
static constexpr uint16_t Egal(const uint8_t& var_) noexcept
{
return static_cast< uint16_t > ( var_ ) ;
}
};
# endif
# include <cstdlib>
# include <iostream>
# include <type_traits>
int main(int argc, char* argv[])
{
std::cout << std::boolalpha
<< "Is constructible : " << std::is_constructible<Moeglich>::value << std::endl
<< "Is destructible : " << std::is_destructible<Moeglich>::value << std::endl
<< "Is copy constructible : " << std::is_copy_constructible<Moeglich>::value << std::endl
<< "Is move constructible : " << std::is_move_constructible<Moeglich>::value << std::endl
<< "Is copy assignable : " << std::is_copy_assignable<Moeglich>::value << std::endl
<< "Is move assignable : " << std::is_move_assignable<Moeglich>::value << std::endl
<< "Is assignable : " << std::is_assignable<Moeglich, Moeglich>::value << std::endl
;
/* Following were what I wanted to prevent anyway :
const Moeglich mom {} ;
Moeglich pop {} ;
Moeglich foo {} ;
foo = mom ;
foo = std::move(pop) ;
*/
return EXIT_SUCCESS ;
}
编辑::我看到我通过模糊地放置一些代码并且没有提及意图而造成了很多混乱。我永远不会构造这个对象。我感兴趣的只是访问
const uint8_t duh { 5 } ;
const uint16_t notEgal { Moeglich::Egal(duh) } ;
这对我来说很重要:有时候,我需要部分模板特殊化的功能,如果我把这个功能放在模板类中,就不能启用它。
我被指向一个链接here,它非常清楚地规定了这条规则。我对编译器的期望是错误的,编译器无法以特殊的方式理解我的用例。
感谢大家的评论。
此致
Sumit