【发布时间】:2016-05-04 15:58:42
【问题描述】:
根据工作草案 N3337(与已发布的 ISOC++11 标准最相似的草案)和cppreference.com,答案是肯定的。
N3337:
表 21 — CopyConstructible 要求(除了 MoveConstructible) [copyconstructible] [...]
类型 T 满足 CopyConstructible if
- 类型 T 满足 MoveConstructible,并且 [...]
但是根据使用 gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 编译 main.cpp 并在 Ubuntu 14.04.3 LTS 中使用引用语句运行 a.out 的结果,答案是否定的。
main.cpp:
#include <iostream>
#include <type_traits>
struct As
{
As()=default;
As(As&&)=delete;
As(const As&)=default;
As& operator=(As&&)=delete;
As& operator=(const As&)=delete;
~As()=default;
};
int main()
{
std::cout<<std::is_move_constructible<As>::value<<std::endl;
std::cout<<std::is_copy_constructible<As>::value<<std::endl;
return 0;
}
从终端编译和运行:
$ g++ -std=c++11 main.cpp
$ ./a.out
结果(输出):
0
1
我是不是理解有误,还是 N3337 和 cppreference.com 错了,还是 gcc 包含错误?
【问题讨论】: