によると、 standard, 14.8.2.1関数呼び出しからのテンプレート引数の控除[temp.deduct.call] P
がテンプレートパラメータで、A
がその位置の関数呼び出し引数です。
01だから、
std::string s{"hello"};
const std::string& sr{s};
Literal l(sr);
A
(SR)与えられた
2 If P is not a reference type:
If A is an array type, the pointer type produced by the array-to-pointer = standard conversion ([conv.array]) is used in place of A for type deduction; otherwise,
If A is a function type, the pointer type produced by the function-to-pointer standard conversion ([conv.func]) is used in place of A for type deduction; otherwise,
If A is a cv-qualified type, the top-level cv-qualifiers of A's type are ignored for type deduction.
If P is a cv-qualified type, the top-level cv-qualifiers of P's type are ignored for type deduction. If P is a reference type, the type referred to by P is used for type deduction. [...]
はconst std::string&
ですが、const性を考え、そのコンパイラはstd::string
とはみなされません。これはあなたに合っています
template <typename V>
Literal(V val)
{
value = val;
}
ですので、この専門用語を使用しています。
template<>
Literal(std::string val)
コンパイラにはこの特殊化がありますが、これはおそらく移動のセマンティクスを使用する必要があります。
#include <iostream>
#include <string>
struct S {
template<typename T>
S(T t) { std::cout << "T t\n"; }
std::string value_;
};
template<>
S::S(std::string value) {
std::cout << "string\n";
value_ = std::move(value);
}
template<>
S::S(const std::string&) {
std::cout << "const string&\n";
}
int main() {
S s1(42);
std::string foo{"bar"};
const std::string& foor = foo;
S s2(foo);
S s3(foor);
}
http://ideone.com/eJJ5Ch
あなたは[値]を宣言していませんでした。 _main.cpp:12:9:error: 'value'がこのスコープで宣言されていませんでした。 value = val; _ –
@HenriqueBarcelos 'ATL :: CComVariant value'は' Expression'で宣言されています。 。簡潔にするために関連するテンプレートを投稿しただけです。 –
私は 'value'が基本クラスで定義されていると仮定しています。 – Bathsheba