MSVC is_copy_assignable永远正确
msvc is_copy_assignable always true?
#include <type_traits>
class Test
{
public:
Test(const Test &) = delete;
Test &operator=(const Test &) = delete;
};
void fn(Test &a, const Test &b) { a = b; }
static_assert(!std::is_copy_assignable<Test>::value, "Test shouldn't be assignable");
在 MSVC 2013 Update 3 下编译此函数意外地使static_assert
失败,并且函数fn
无法编译(如预期的那样(。这是矛盾的,对吧?
我是否滥用is_copy_assignable
?有没有其他方法可以测试这种情况?
你是对的,这是一个错误:https://connect.microsoft.com/VisualStudio/feedback/details/819202/std-is-assignable-and-std-is-constructible-give-wrong-value-for-deleted-members
我拿了cplusplus.com的is_copy_assignable
代码:
#include <iostream>
#include <type_traits>
struct A { };
struct B { B& operator= (const B&) = delete; };
int main() {
std::cout << std::boolalpha;
std::cout << "is_copy_assignable:" << std::endl;
std::cout << "int: " << std::is_copy_assignable<int>::value << std::endl;
std::cout << "A: " << std::is_copy_assignable<A>::value << std::endl;
std::cout << "B: " << std::is_copy_assignable<B>::value << std::endl;
return 0;
}
并在Visual Studio 2013上对其进行了测试,并得到:
is_copy_assignable:
整数:真
答:真
B:真
在 gcc 4.8.1 上,我得到了:
is_copy_assignable:
整数:真
答:真
B:假
值得注意的是,在Visual Studio 2015 Beta上,这是固定的。我得到:
is_copy_assignable:
整数:真
答:真
B:假
您如何看待测试版;)
可能有点
太晚了,但我在这里有一个解决方法:定义另一个复制和移动赋值运算符,也定义为已删除的运算符。编译器发出警告,抱怨多个复制运算符 (C4522(,因此您必须为类禁用它:
#pragma warning (disable: 4522)
class A
{
A& operator=(const A&) = delete;
A& operator=(A) = delete;
};
#pragma warning (default: 4522)
现在std::is_copy_assignable<A>::value
false
.
相关文章:
- std::filesystem::copy throws filesystem_error
- 为什么是谷神星协方差.计算()似乎永远运行而不返回?
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- 密码登录程序将永远循环并显示不正确的结果
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- SFML 碰撞永远不会在我的系统中注册
- 先进先出:一个进程永远不会从管道读取
- 移动构造函数永远不会被调用
- C++ 一个lambda浅拷贝const Type&如果它被赋予一个命名捕获,如[copy=val](){}?
- 程序永远不会进入虚拟析构函数
- QML/C++/QObject Struct Copy
- C++赋值运算符,我们可以用 copy 替换它吗?
- 为什么我使用 std::copy() 收到运行时错误(分段错误)?
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- 在 *.cpp 文件中实现的 c++ 函数/方法永远不会内联扩展吗?
- 如何使用 std::copy 当类有"无符号字符和运算符[]"时
- std::copy 导致运行时检查失败 #2
- 为什么 Clang 在命名空间'std'中没有名为 'copy' 的成员给出错误
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- 指针永远不会在链表深层复制构造函数中达到 null