5

例:

#include <iostream>
#include <boost/call_traits.hpp>
#include <type_traits>

boost::call_traits<int>::param_type f()
{
        return 1;
}

int main()
{
        std::cout << std::boolalpha;
        std::cout <<
        std::is_const<boost::call_traits<int>::param_type>::value
        << std::endl; // true
        std::cout << std::is_const<decltype(f())>::value << std::endl; // false

}

質問:

私が何か間違ったことをしていない限り、両方を取得する必要があると思いますtrueが、gcc 4.7.0falseは後者を出力します。足りないものはありますか?

4

1 に答える 1

8

非クラス型の右辺値は const 修飾されません。const 修飾できるのは、クラス型の右辺値だけです。

したがって、関数fが a を返すように宣言されていconst intても、関数の型が であってもfconst int()呼び出し式f()は (non-const) 型の右辺値ですint

(新しい C++11 式カテゴリ分類では、呼び出し式f()は type のprvalue ですint同じ規則が適用されます。C++11 §3.10/4 は、「非クラスの prvalue は常に cv 修飾されていない型を持つ」と述べています。)

于 2012-06-05T21:11:35.413 に答える