概要
関数の引数の型について、参照の有無によってg++とclang++のコンパイル結果が異なる。
コンパイラ
g++ 7.3.1
clang++ 6.0.0
コード1
#include <iostream>
template <typename T>
void func(T obj)
{
constexpr char const* x = obj();
std::cout << x << std::endl;
}
int main()
{
func( []{ return "test"; } );
}
コード2
#include <iostream>
template <typename T>
void func(T const& obj)
{
constexpr char const* x = obj();
std::cout << x << std::endl;
}
int main()
{
func( []{ return "test"; } );
}
|
|
g++ |
OK |
clang++ |
error: constexpr variable 'x' must be initialized by a constant expression |
コード3
#include <iostream>
template <typename T>
void func(T&& obj)
{
constexpr char const* x = obj();
std::cout << x << std::endl;
}
int main()
{
func( []{ return "test"; } );
}
|
|
g++ |
OK |
clang++ |
error: constexpr variable 'x' must be initialized by a constant expression |