此代碼編譯並運行正常鏗鏘,但給人的gcc編譯錯誤:這個模板函數是否能正確地匹配一個具有多個基數的類?
no matching function for call to ‘unpack(tag1, A3&)’
因此,它是合法的C++?
#include <type_traits>
#include <utility>
#include <cassert>
template <class Tag, class Value>
class Pack
{
public:
Pack(const Value& value) : _value(value) {}
Value value() const { return _value; }
private:
Value _value;
};
template<class Tag, class Value>
decltype(auto) unpack(Tag, Pack<Tag, Value>& pack) {
return pack.value();
}
struct tag1 {};
struct tag2 {};
struct A3 : Pack<tag1, int>, Pack<tag2, double> {
A3(int x, double y) : Pack<tag1, int>(x), Pack<tag2, double>(y) {}
};
int main() {
A3 a3(1, 2);
assert(unpack(tag1(), a3) == 1);
assert(unpack(tag2(), a3) == 2);
}
在此上下文中的「有效」意味着兩件事情 - 合成正確或良好的設計。你是指哪一個? –
句法正確 – rnickb
@RSahu:我不同意。在這種情況下,「有效」只能意味着句法上的正確。 – ruakh