

下記のようにoperator `=`をdefaultで宣言するとintel c++
compilerでコンパイル時にエラーメッセージが出るのですが、gccやclangでは問題なくコンパイルできるので、コンパイル時のオプションが足りていないのでしょうか？

**エラーメッセージ**

[code]

    icpc -std=c++17 sample.cpp
    ld: /tmp/icpczIU0ix.o:(.rodata._ZTV6Entity[_ZTV6Entity]+0x10): undefined reference to `Entity::operator=(Entity const&)'
    
[/code]

**ソースコード**

[code]

    #include <iostream>
    class Entity {
        public:
            Entity() = default;
            virtual Entity & operator = ( Entity const & )=default;
        public:
            int index;
    };
    
    Entity e1 = Entity();
    
    int main() {
        std::cout << e1.index;
        return(0);
    }
    
    
[/code]

**環境**  
Intel Compiler: icpc (ICC) 19.0.5.281 20190815  
OS: Arch linux

**追記**  
インテルのフォーラムの方に報告したところ、バグとしてアクセプトされました。  
<https://software.intel.com/en-us/forums/intel-c-compiler/topic/837004>


CC BY-SA 4.0
2019-11-18T03:05:28.197
60620
2019-11-21T03:58:34.117
2019-11-21T03:58:34.117
36670
36670
question
c++
intel C++ コンパイラーでoperatorをdefault宣言するとコンパイル時にエラーになる。


[P0135R1 Guaranteed copy elision](http://www.open-
std.org/jtc1/sc22/wg21/docs/papers/2016/p0135r1.html)で

>   * If the initializer expression is a prvalue and the cv-unqualified
> version of the source type is the same class as the class of the
> destination, the initializer expression is used to initialize the
> destination object. [ _Example_ : `T x = T(T(T()));` calls the `T` default
> constructor to initialize `x`. ]
>

とされているため

[code]

    Entity e1 = Entity();
    
[/code]

ももちろん

[code]

    Entity e1;
    
[/code]

として扱われます。[C++17 Features Supported by Intel® C++
Compiler](https://software.intel.com/en-us/articles/c17-features-supported-by-
intel-c-compiler)によるとP0135R1にはVersion 19.0.1で対応済みとされているため、質問の状況はコンパイラーのバグかと。


CC BY-SA 4.0
2019-11-18T04:09:29.267
60622
2019-11-18T04:09:29.267
4236
60620
answer


sayuriさん回答にある通り、Intel C++ Compiler側のバグが疑われますね。

一方で、非virtualなコピー代入演算子であれば Intel C++ Compiler(icc) 19.0.1 でも期待通り動作するようです。  
<https://godbolt.org/z/aCnsXa>

C++では、コピー代入演算子は非virtualメンバ関数とすることが推奨されます。virtualメンバ関数とする強い理由があれば別ですが、質問中コードであれば明らかに非virtualをおすすめします。  
[C.60: Make copy assignment non-`virtual`, take the parameter by `const&`, and
return by
non-`const&`](http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#c60-make-
copy-assignment-non-virtual-take-the-parameter-by-const-and-return-by-non-
const)


CC BY-SA 4.0
2019-11-19T03:19:04.937
60649
2019-11-19T03:19:04.937
49
60620
answer