前提
定数式を理解していたつもりですが,解決できない事例が出てきました。
以下の bar関数の#1 のコードのように ar を参照にしないとエラーは出ないのに,#2 のコードのように,参照をつけるとコンパイルできません。これはどのような理由によるものなのでしょうか。調べても分かりませんでした。
また,foo関数をどのように変更するとコンパイルできるのでしょうか。
実現したいこと
以下のコードの#2のように左辺値参照のまま,fooに渡したい。右辺値の参照でもよい。
発生している問題・エラーメッセージ
Constexpr variable 'D' must be initialized by a constant expression function parameter 'ar' with unknown value cannot be used in a constant expression
該当のソースコード
C++
1#include<array> 2#include<iostream> 3 4template<typename T> 5constexpr std::size_t foo( T&& ar ) { 6 return ar.size(); 7} 8 9template<typename T> 10void bar(T ar){ //#1 11//void bar(const T& ar){ //#2 エラーとなる 12//void bar( T&& ar ){ //#2 エラーとなる 13 constexpr std::size_t D = foo(ar); 14 std::cout << D <<'\n'; 15} 16 17int main (){ 18 std::array<int,3> ar{1,2,3}; 19 bar(ar); 20}
試したこと
以下のようにfooの引数arの参照を外してみた。bar( T ar )でもコンパイルできませんでした。
エラー内容
constexpr std::size_t D = foo(ar);の行において
function parameter 'ar' with unknown value cannot be used in a constant expression
c++
1 2template<typename T> 3constexpr 4std::size_t 5foo( T ar ) {///参照を外した 6 return ar.size(); 7}
補足情報(FW/ツールのバージョンなど)
clang
C++17
回答2件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/09/20 10:07
2022/09/20 11:44