根据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;
}
Run Code Online (Sandbox Code Playgroud)
从终端编译和运行:
$ g++ -std=c++11 main.cpp
$ ./a.out
Run Code Online (Sandbox Code Playgroud)
结果(输出):
0
1
Run Code Online (Sandbox Code Playgroud)
我误解了某些内容,或者N3337和cppreference.com是否错误,或者gcc是否包含错误?
如果程序根据C++ 11标准以不可预测的方式运行,是否有任何命令行选项或技术使GCC编译器报告错误?
根据N3337工作草案(与已发布的ISOC++ 11标准最相似的草案),答案最多只有一个.
N3337:
最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值.
Run Code Online (Sandbox Code Playgroud)[ Example: struct X { operator int(); }; struct Y { operator X(); }; Y a; int b = a; // error // a.operator X().operator int() not tried int c = X(a); // OK: a.operator X().operator int() —end example ]
但根据使用gcc(Ubuntu 4.8.4-2ubuntu1~14.04)4.8.4编译main.cpp并在Ubuntu 14.04.3 LTS中使用引用语句运行a.out的结果,答案最多不是一个.
main.cpp:
#include <iostream>
struct As
{
operator int(){ std::cout<<"operator As::int()"<<std::endl; return 1; }
};
struct Bs
{
operator int(){ std::cout<<"operator …Run Code Online (Sandbox Code Playgroud)